使用decltype(var)后跟内部类型“var”的C ++ 11编译器错误
我使用的是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'
这是去年在Connect上引发的Visual Studio错误。 它是问题757545(“范围运算符之前不能使用decltype”)。
这个问题有一个解决方法,它与@ iammillind完全相同,只是它使用std::identity
,不管出于什么原因,它都是在发布C ++ 11之前不久从<functional>
删除的。 ( std::common_type
与一个模板参数是等价的; std::remove_reference
在某些情况下是相同的。)
我用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)
上一篇: C++11 compiler error when using decltype(var) followed by internal type of "var"