При попытке скомпилировать простой класс (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)
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.
Обновить! Мы на GCC 4.7 в эти дни.
GCC 4.2.1 с самого начала 18 июля 2007 г.. Есть только отдаленный шанс, что он поддерживает любой особенности из того, что стало C ++ 11.
Тем не менее, это может обеспечить некоторые в std::tr1
(Т.е. std::tr1::tuple<T1, T2, ...>
), в которой некоторые функции C ++ 11 жили до того, как была проведена стандартизация, хотя, вне всяких сомнений, они были представлены в GCC только в 4.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 может быть более подходящим.
Если вы добавите -std=c++11
(или для более старых версий g++
-std=c++0x
) и добавьте символьную кавычку после выражения в функции-члене, которую компилирует код. Если это не работает, у вас может быть версия, которая определяет только tuple
в пространстве имен std::tr1
(кажется, реализация обеспечивает <tuple>
заголовок, хотя, потому что нет ошибки о <tuple>
не найден).