9

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

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

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

我的班级.h

#ifndef MYCLASS
#define MYCLASS

#include <iostream>
#include <tuple>

class MyClass {
    std::tuple<bool, int, int> my_method();
};

#endif

我的类.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 的“元组”:错误:无效使用“: :'<br> myclass.h:7: 错误:预期 ';' 在'<'之前 token
myclass.cpp:5: 错误: '<' 之前的预期构造函数、析构函数或类型转换 令牌

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

4

4 回答 4

18

每台 Mac 附带的 GCC 4.2.1 已经过时。它不会识别 C++11。

您需要使用以下命令编译代码:c++ 而不是调用 clang 的 g++,这是 mac 上官方更新的编译器。

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

您需要链接 libc++,它是 clang lib,它知道 c++11 的特性,而不是 gcc 使用的默认 libstdc++。

于 2012-12-22T20:00:06.630 回答
5

更新!这些天我们在 GCC 4.7 上。

GCC 4.2.1 是从2007 年 7 月 18 日开始的。它支持C++11 中的任何特性的可能性很小。

也就是说,它可能会提供一些 in std::tr1(ie std::tr1::tuple<T1, T2, ...>),这是标准化之前的一些 C++11 特性所在的地方,尽管我没想到这些只是在 4.4 中引入 GCC。

于 2012-12-22T19:59:02.950 回答
4

使用 gcc 4.2,tuple位于 namespace 中std::tr1。您必须<tr1/tuple>或多或少像这样包含并指定您的方法

#ifndef MYCLASS
#define MYCLASS

#include <tr1/tuple>

class MyClass {
    std::tr1::tuple<bool, int, int> my_method();
};

#endif

尽管正如其他人已经建议的那样,更新到更新的 gcc 可能更合适。

于 2012-12-22T20:08:48.813 回答
1

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

于 2012-12-22T19:52:40.987 回答