9

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

2 回答 2

8

这是去年在 Connect 上提出的 Visual Studio 错误。这是问题 757545(“不能在范围运算符之前使用 decltype”)

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

于 2013-01-15T04:20:44.680 回答
5

我看到使用 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)

于 2013-01-15T03:46:23.210 回答