g ++ — ISO C ++ запрещает объявление «кортежа» без типа

При попытке скомпилировать простой класс (g++ myclass.cpp), Я получаю следующую ошибку:

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

Я искал эту проблему, и в большинстве случаев люди, казалось, забыли 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
In file included from myclass.cpp:1:
myclass.h:7: error: ISO C++ forbids declaration of ‘tuple’ with no type
myclass.h:7: error: invalid use of ‘::’
myclass.h:7: error: expected ‘;’ before ‘<’ token
myclass.cpp:5: error: expected constructor, destructor, or type conversion before ‘<’ token

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

8

Решение

GCC 4.2.1, поставляемый с каждым Mac, устарел. Он не распознает C ++ 11.

Вам нужно скомпилировать свой код, используя: c ++ вместо g ++, который вызывает clang, который является официально обновленным компилятором для Mac.

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

Вы должны ссылаться на libc ++, который является clang lib, который знает о возможностях c ++ 11 вместо libstdc ++ по умолчанию, используемого gcc.

14

Другие решения

Обновить! Мы на GCC 4.7 в эти дни.

GCC 4.2.1 с самого начала 18 июля 2007 г.. Есть только отдаленный шанс, что он поддерживает любой особенности из того, что стало C ++ 11.

Тем не менее, это может обеспечить некоторые в std::tr1 (Т.е. std::tr1::tuple<T1, T2, ...>), в которой некоторые функции C ++ 11 жили до того, как была проведена стандартизация, хотя, вне всяких сомнений, они были представлены в GCC только в 4.4.

5

С 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 может быть более подходящим.

3

Если вы добавите -std=c++11 (или для более старых версий g++ -std=c++0x) и добавьте символьную кавычку после выражения в функции-члене, которую компилирует код. Если это не работает, у вас может быть версия, которая определяет только tuple в пространстве имен std::tr1 (кажется, реализация обеспечивает <tuple> заголовок, хотя, потому что нет ошибки о <tuple> не найден).

1
По вопросам рекламы [email protected]