使用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)

链接地址: http://www.djcxy.com/p/66499.html

上一篇: C++11 compiler error when using decltype(var) followed by internal type of "var"

下一篇: Recursive trailing return type?