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