ISO C ++禁止声明'tuple'没有类型

问题描述 投票:8回答:4

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

ISO C ++禁止声明'tuple'没有类型

我搜索了这个问题,在大多数情况下,人们似乎忘记了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 ++禁止声明'tuple'没有类型 myclass.h:7:错误:无效使用'::' myclass.h:7:错误:在'<'标记之前预期';' 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)

c++ g++ tuples std std-pair
4个回答
17
投票

每个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 ++。


5
投票

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

GCC 4.2.1来自18th July, 2007。只有很少的机会它支持C ++ 11中的任何功能。

也就是说,它可以在std::tr1(即std::tr1::tuple<T1, T2, ...>)中提供一些,这是一些C ++ 11特征在标准化之前的时间所存在的地方,尽管我不知道这些仅在4.4中被引入GCC。


4
投票

使用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

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.