2012-12-22 7 views
6

で「タプル」の宣言を禁止しますstd::を忘れるか、またはヘッダーに<tuple>を含めてください。しかし、私は両方を持っています。ここに私のコードです:ISO C++には、単純なクラス(<code>g++ myclass.cpp</code>)をコンパイルしようとすると、私は次のエラーを取得するなしタイプ

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); 
} 

私は2番目のintを除外し、<set>を含めて、代わりにpairを使用して同じことを行う場合、 できます。

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

編集:ここでは

がフル出力である:あなたが-std=c++11(または、g++-std=c++0xの古いバージョンのための)を追加した場合

$ 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) 
+5

コードをコンパイルするときに '-std = C++ 11'を指定しましたか? –

+5

'using namespace std;' - どのような冒涜です! –

+0

このエラーは再現できません。このコードを正確に使用してもよろしいですか? g ++が報告した正確な行をマークする必要があります。 – Zeta

答えて

12

すべてのMacで出荷されるGCC 4.2.1は旧式です。 C++ 11は認識されません。

次のコードを使用してコードをコンパイルする必要があります。g ++ではなくC++で、clangは正式に更新されたMacのコンパイラです。

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

あなたは約C++ 11の機能の代わりに、GCCが使用するデフォルトのlibstdC++を知って打ち鳴らすlibにあるのlibC++をリンクするために必要とされています。

+1

何故私の2012年のMac(OS X 10.8.2、最新のXcode)に古いGCCがあるのでしょうか? (私はそれを自分でインストールしなかった、Xcodeはおそらくそうした)。私が更新しようとすると私の環境が壊れるのを恐れている。 – Jawap

+0

正常ではありません。 Appleはclangに動いてgccを落としましたが、レトロな互換性を損なわないようにしています。 – Kikohs

+0

gccを更新しようとすると環境が壊れる可能性があります。使用clang、それはとにかく高速です... – Kikohs

1

オプションとコードがコンパイルするメンバ関数の式の後にシミコロンを追加します。これが機能しない場合、名前空間std::tr1tupleしか定義されていないバージョンがあるかもしれません(<tuple>が見つからないというエラーはないので、実装は<tuple>ヘッダーを提供しているようです)。

5

更新!我々は最近、GCC 4.7を利用しています。

GCC 4.2.1はまったく戻って18th July, 2007です。それは、フィーチャーがC++ 11になったものをサポートするという唯一の可能性があります。

これは、std::tr1(すなわちstd::tr1::tuple<T1, T2, ...>)の一部を提供するかもしれないと言いました。これは、標準化の前にC++ 11の機能の一部が存在していた場所ですが、頭の上からGCCに4.4。

+1

2012年のMac(OS X 10.8.2、最新Xcode)に古いGCCがある理由は何ですか? (私はそれを自分でインストールしなかった、Xcodeはおそらくそうした)。私が更新しようとすると私の環境が壊れるのを恐れている。 – Jawap

+0

@ Jawap:私を打つ。パッケージングチームに相談してください。 –

+1

Macでgccを更新することはお勧めできません。互換性が失われます。あなたはgccを持つことができますが、/ usr/bin/gccにはありません – Kikohs

3

gcc 4.2では、tupleは名前空間std::tr1にありました。あなたは<tr1/tuple>が含まれており、他の人がすでに示唆したように、より適切であるかもしれない、より最近のgccへの更新、なお、本

#ifndef MYCLASS 
#define MYCLASS 

#include <tr1/tuple> 

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

#endif 

のように、多かれ少なかれ、あなたの方法を指定する必要があります。

関連する問題