我应该这样写吗:
template<class T> class Foo {
typename const T* x;
};
或者:
template<class T> class Foo {
const typename T* x;
};
发布于 2017-05-10 17:17:34
typename
需要与您尝试获取的类型相匹配。例如,如果您有
template <typename T>
void foo(T& t)
{
typename const T::iterator bar = t.begin();
}
int main()
{
std::vector<int> bar{1,2,3}
foo(bar);
}
您将得到一个针对typename const T::const_iterator bar = t.begin();
的编译器错误,如下所示
应在“const”之前使用嵌套名称说明符
Where as
const typename T::iterator bar = t.begin();
工作得很好。
有关template
和typename
需要出现的时间、位置和原因的全面解释,请参阅:Where and why do I have to put the "template" and "typename" keywords?
发布于 2017-05-10 17:17:13
typename
不是这样使用的,所以这两种情况都是无效的,应该会产生编译错误,如下所示:
main.cpp:4:20: error: expected a qualified name after 'typename'
const typename T* x;
^
在这里,您需要像T::myType
这样的东西才能继续运行。
或者甚至是这样,更糟糕的是:
main.cpp:4:14: error: expected a qualified name after 'typename'
typename const T* x;
^
main.cpp:4:14: error: expected member name or ';' after declaration specifiers
在expected a qualified name after 'typename'中的相关例子。
引入关键字typename是为了指定后面的标识符是一个类型
发布于 2017-05-10 17:18:08
在这里使用typename
没有任何意义。
如果要访问T::type
这样的别名类型,则必须使用,因为在这种类型中,不能在typename
和T::type
之间使用const
const typename T::type * x; // ok
typename T::type const * x; // ok
typename const T::type * x; // error
https://stackoverflow.com/questions/43898730
复制