9

単純なクラス()をコンパイルしようとすると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代わりに同じことを使用して、2番目を省略し、intを含める<set>と、機能します。

私は何が欠けていますか?

編集:

完全な出力は次のとおりです。

$ g ++ myclass.cpp -o prog
myclass.cpp:1からインクルードされたファイル: myclass.h:7:エラー:ISO C ++は、タイプ myclass.h:7
のない'タプル'の宣言を禁止します:エラー:'の無効な使用:
:'<br> myclass.h:7:エラー:予期された'; ' '&lt;'の前 トークン
myclass.cpp:5:エラー:'&lt;'の前にコンストラクタ、デストラクタ、または型変換が必要です トークン

$ g ++ --version
i686-apple-darwin11-llvm-g ++-4.2(GCC)4.2.1(Apple Inc.ビルド5658に基づく)
(LLVMビルド2336.11.00)

4

4 に答える 4

18

すべてのMacに同梱されているGCC4.2.1は古くなっています。C++11は認識されません。

Macで公式に更新されたコンパイラであるclangを呼び出すg++の代わりにc++を使用してコードをコンパイルする必要があります。

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

gccで使用されるデフォルトのlibstdc++ではなく、c++11の機能を認識しているclanglibであるlibc++に対してリンクする必要があります。

于 2012-12-22T20:00:06.630 に答える
5

アップデート!最近はGCC4.7を使用しています。

GCC 4.2.1は、2007年7月18日までさかのぼります。C++11になったものからの機能をサポートする可能性はほとんどありません。

std::tr1とは言うものの、標準化前の時代にC ++ 11の機能の一部が存在していた場所(つまり)を提供する可能性がありますstd::tr1::tuple<T1, T2, ...>が、私の頭から離れて、これらは4.4でのみGCCに導入されました。

于 2012-12-22T19:59:02.950 に答える
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に更新する方が適切な場合があります。

于 2012-12-22T20:08:48.813 に答える
1

-std=c++11(または、古いバージョンのg++)オプションを追加-std=c++0xし、メンバー関数の式の後にsimicolonを追加すると、コードがコンパイルされます。これが機能しない場合はtuple、名前空間でのみ定義されているバージョンがある可能性があります(ただし、見つからないことに関するエラーがないためstd::tr1、実装は<tuple>ヘッダーを提供しているようです)。<tuple>

于 2012-12-22T19:52:40.987 に答える