我正在使用 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'
我正在使用 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 的相同,只是它使用了在 C++11 发布前不久std::identity
被删除的解决方法,无论出于何种原因。<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)