9

私は Visual C++ 2010 を使用しています。コード スニペットは次のとおりです。

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'
4

2 に答える 2

8

これは、昨年Connectで発生したVisualStudioのバグです。問題757545(「スコープ演算子の前にdecltypeを使用できません」)です。

この問題には、@ iammillindと実質的に同じ回避策がリストされていますが、何らかの理由でC++11の公開直前にstd::identity削除されたものを使用している点が異なります。<functional>std::common_type1つのテンプレートパラメーターを使用することは同等です。std::remove_reference場合によっては同じです。)

于 2013-01-15T04:20:44.680 に答える
5

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

#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

次のように使用します。

DECLTYPE(s)::value_type param = 0;

免責事項:もちろん、このトリックでは、typenameテンプレート内で使用する必要がある場合があります。そのために、次のようなマクロをもう 1 つ持つことができます。#define TDECLTYPE(VAR) typename DECLTYPE(VAR)

于 2013-01-15T03:46:23.210 に答える