我在C ++中有这段代码
template<typename T>
class DD
: public enumerables<T>
{
...
private:
typename const DD<T>& mContainer;
}
它给了我两条错误信息:
typename const
代码有什么问题?它使用MSVC C ++编译好。
typename DD<T>& const mContainer;
和const typename DD<T>& mContainer;
给了我同样的错误。
答案 0 :(得分:12)
嗯,typename
在那做什么?您没有提到嵌套类型,因此typename
完全没必要。我会说这个错误是由typename
的无理使用造成的,而不是通过对声明部分或其他任何内容的排序。
应该只是
const DD<T>& mContainer;
甚至
const DD& mContainer;
答案 1 :(得分:4)
除了在引入模板类型参数时,关键字typename
必须始终后面紧跟一个可选的全局范围::
令牌,然后嵌套 - 名称说明符;也就是说,有一个或多个名称空间或类,每个名称后跟::
标记。
请参阅C ++标准中的语法规则:5.2(函数样式转换),7.1.5.3(详细说明的类型说明符)和7.3.3(使用声明)。
此外,14.6p5:“关键字typename
仅适用于限定名称,但这些名称不必相关。”
Microsoft的编译器接受无效语法是错误的。
答案 2 :(得分:0)
如果它对某人有所帮助,因为我没有看到它明确地作为答案或注释提及(尽管引用C ++规范引用的答案暗示了它),如果在依赖类型为礼物。
例如:
<template T>
void foo(typename const T::size_type & n);
解决方法是将const
移到typename
之前:
<template T>
void foo(const typename T::size_type & n);
确认适用于GCC(4.9)和MSVC(2017)。