ISO C 禁止没有类型的“元组”声明

ISO C++ forbids declaration of ‘tuple’ with no type

本文关键字:元组 声明 类型 禁止 ISO      更新时间:2023-10-16

尝试编译简单类(g++ myclass.cpp)时,我会收到以下错误:

ISO C 禁止没有类型的"元组"声明

我搜索了这个问题,在大多数情况下,人们似乎忘记了std::或在标题中包括<tuple>。但是我都有。这是我的代码:

myClass.h

#ifndef MYCLASS
#define MYCLASS
#include <iostream>
#include <tuple>
class MyClass {
    std::tuple<bool, int, int> my_method();
};
#endif

myClass.cpp

#include "myclass.h"
using namespace std;
tuple<bool, int, int> MyClass::my_method() {
    return make_tuple(true, 1, 1);
}

如果我改用pair进行相同的操作,请遗漏第二个int,包括<set>,它有效。

我缺少什么?

编辑:

这是完整的输出:

$ g myclass.cpp -o prog
在myClass.cpp中包含的文件中:1:
myclass.h:7:错误:ISO C 禁止没有类型的"元组"声明
myclass.h:7:错误:无效使用'::'
myclass.h:7:错误:预期';''&lt;'token
myClass.cpp:5:错误:预期的构造函数,驱动器或类型转换 在"&lt;"代币

之前

$ g - version
i686-Apple-darwin11-llvm-g -4.2(GCC)4.2.1(基于Apple Inc.构建5658)
(LLVM构建2336.11.00)

gcc 4.2.1随着每个Mac的运输已过时。它将无法识别C 11。

您需要使用:C 来编译代码,而不是g ,该代码称为Clang,这是Mac上的正式更新编译器。

c++ -std=c++11 -stdlib=libc++ myclass.cpp -o prog 

您必须针对libc 链接,该libc 是Clang lib,它知道C 11功能,而不是GCC使用的默认LIBSTDC 。

更新!这些天我们正在使用GCC 4.7。

gcc 4.2.1从2007年7月18日一直到。它只有一个远程机会支持任何的功能。

也就是说,它可能会在std::tr1(即std::tr1::tuple<T1, T2, ...>)中提供一些,这是C 11特征中的一些特征在标准化之前的时间居住,尽管我的头顶不在我的头顶上,仅将其引入了4.4中的GCC。

使用GCC 4.2,tuple在命名空间std::tr1中。您必须包括<tr1/tuple>并或多或少地指定您的方法

#ifndef MYCLASS
#define MYCLASS
#include <tr1/tuple>
class MyClass {
    std::tr1::tuple<bool, int, int> my_method();
};
#endif

尽管正如其他人已经建议的那样,更新到最近的海湾合作委员会可能更合适。

如果添加了 -std=c++11(或者,对于 g++的旧版本 -std=c++0x)选项,并在成员函数中的表达式之后添加一个simicolon,则代码编译了代码。如果这不起作用,则可能有一个版本,该版本仅在命名空间std::tr1中定义tuple(似乎,实现提供了<tuple>标题,因为没有找到<tuple>的错误)。