假设我有一些stl容器类obj
的对象。我可以这样定义同类型的其他对象:
decltype(obj) obj2;
但是我不能用这种方式为容器声明迭代器:
decltype(obj)::iterator it = obj.begin();
为什么呢?我做错了吗?
答案 0 :(得分:16)
根据最终的C ++ 0x草案(FDIS),您的代码格式正确。这是Visual Studio编译器尚未实现的后期更改。
与此同时,解决方法是使用typedef:
typedef decltype(obj) obj_type;
obj_type::iterator it = obj.begin();
编辑:相关章节和经文是5.1.1 / 8:
qualified-id: [...] nested-name-specifier templateopt unqualified-id nested-name-specifier: [...] decltype-specifier :: decltype-specifier: decltype ( expression )
为了完整起见:
答案 1 :(得分:8)
这是因为解析语言的方式。
decltype(obj)::iterator it = obj.begin();
你希望它成为
(decltype(obj)::iterator) it;
但事实上,它变成了
decltype(obj) (::iterator) it;
我必须承认,我也很惊讶地发现情况确实如此,因为我确信我之前已经这样做了。但是,在这种情况下,您可以使用auto
,甚至decltype(obj.begin())
,但此外,您可以执行
typedef decltype(obj) objtype;
objtype::iterator it;
答案 2 :(得分:2)
在修复VC ++的解析器以反映FDIS之前的另一个解决方法是使用std::identity<>
元函数:
std::identity<decltype(obj)>::type::iterator it = obj.begin();