2013-01-15 5 views
8

私は、Visual C++ 2010を使用していて、ここに私のコードスニペットだC++ 11コンパイラエラー「VAR」の内部型に続いてdecltype(VAR)を使用して

std::set<int> s; 
decltype(s)::value_type param = 0; 

私は、次のエラーメッセージが表示されました誰でも私を助けることができますか?

> error C2039: 'value_type' : is not a member of '`global namespace'' 
> error C2146: syntax error : missing ';' before identifier 'param' 
+8

コンパイラのバグです。 –

答えて

7

などのマクロを1つ追加することができます。これは、昨年Connectで提起されたVisual Studioのバグです。それはissue 757545 ("Cannot use decltype before scope operator")です。

問題は何か理由を問わず、std::identity<functional>の直前に削除されたという点を除いて、@ iammillindと実質的に同じ回避策が並んでいます。 (std::common_typeと1つのテンプレートパラメータが等しい場合は、std::remove_referenceが同じ場合があります)

+0

@Potatoswatter:特に、Connectに投稿される回避策はVSがサポートしているためです。私は、回避策の提出者がそれを書き留めておきたいと思います。 [驚き、MSDNは気にしません。](http://msdn.microsoft.com/en-gb/library/ee391705.aspx) –

+4

'std :: common_type 'が実際に正しい置き換えです。 – Xeo

4

g ++ 4.7.2バージョンでは、コードが正常にコンパイルされます。したがって、コンパイラのバグがMSVSになる可能性があります。時間
はあなたがトリックの下に試すことができている:

DECLTYPE(s)::value_type param = 0; 

免責事項

#ifdef COMPILER_BUG_STILL_THERE 
template<typename T> struct Get { typedef T type; }; 
#define DECLTYPE(VAR) Get<decltype(VAR)>::type 
#else 
#define DECLTYPE(VAR) decltype(VAR) 
#endif 

は、としてそれを使用勿論、このトリックで、あなたはtypename時に内部のテンプレートを使用する必要があります。そのためには、​​

関連する問題