使用decltype(var)后跟内部类型" var"时出现C ++ 11编译错误

时间:2013-01-15 03:36:33

标签: c++ visual-studio-2010 c++11 compiler-errors decltype

我正在使用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'

2 个答案:

答案 0 :(得分:7)

这是去年在Connect上提出的Visual Studio错误。它是issue 757545 ("Cannot use decltype before scope operator")

该问题与其一起列出的解决方法实际上与@ iammillind相同,除了它使用在{C ++ 11发布前不久std::identity删除的<functional>,无论如何原因。 (std::common_type只有一个模板参数是等效的; std::remove_reference在某些情况下是相同的。)

答案 1 :(得分:4)

我看到使用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。为此,您还可以再添加一个宏,例如#define TDECLTYPE(VAR) typename DECLTYPE(VAR)