据我所知,decltype用于查询对象/变量的类型等。
来自维基百科上的示例,例如:
int i;
decltype(i) x3; // type is int
我以为我可以这样做:
class A
{
public:
int a, b;
};
template<typename T>
struct IsClass
{
enum { Yes = std::is_class<T>::value };
enum { No = !Yes };
};
std::vector<A> v;
auto it = v.begin();
IsClass<decltype(it)::value_type>::Yes
因为毕竟这条线是合法的:
IsClass<std::vector<A>::iterator::value_type>::Yes
唉它不会编译,引用以下内容:error C2039: 'value_type' : is not a member of '
全局命名空间''`
为什么范围解析是在存在decltype的情况下以这种方式运行的任何想法?
P.S:如果它有任何区别我正在使用MSVC2012(没有 11月CTP)
答案 0 :(得分:10)
这是Visual C ++编译器中的已知错误。从Visual C ++ 2013 Preview开始,它尚未修复。您可以使用std::common_type
:
IsClass<std::common_type<decltype(it)>::type::value_type>::Yes
^^^^^^^^^^^^^^^^^ ^^^^^^^
(带有单个模板参数的std::common_type
产生该参数类型;它是长期用于元编程的identity
模板的标准化C ++ 11等效项。)
您可以在Microsoft Connect上找到公开错误报告:Cannot use decltype before scope operator。如果此问题对您很重要,请考虑更新该错误报告。