可能重复:
Where and why do I have to put "template" and "typename" on dependent names?
我只知道它们被使用的两种情况(这是我认为的模板参数依赖性,但我不知道这两种形式):
<typename T>
typename X::Sub_type Xx
所以一般情况下还有更多的案例,或者背后有一些理论呢?
答案 0 :(得分:3)
您需要typename
关键字来引用模板参数上名称为 dependent 的类型。依赖的确切规则并不简单,但基本上任何类型或模板参数内部的任何类型,或任何具有您自己模板的参数的模板的实例化都是相关的。
template <typename T, int I>
struct test {
typename T::x x; // internal to your argument
typename other_template<T>::y y; // to the instantiation of your template with an argument
typename another_tmpl<I>::z z; // even if the template argument is not a type
};
答案 1 :(得分:0)
1&gt;这不是真正的原因,因为您可以简单地将<class T>
作为替代。
<typename T>
2 - ;这是typename背后的真正原因,它在合格的依赖类型之前需要它。
template <class T>
void foo() {
typename T::iterator * iter;
...
}
这里没有typename,有一个C ++解析规则,说明合格的从属名称应该被解析为非类型,即使它会导致语法错误。