查看二叉树的源代码,我找到以下函数:
//definition of BTR,in case you'd want to know
template< class Type>
struct BTR
{
// The item saved to that specifiec position into the tree
Type value;
// Points to the left leaf
BTR<Type>* left;
// Points to the right leaf
BTR<Type>* right;
};
//why typename?
template< class Type>
BTR<Type>* CreateEx(typename const std::vector<Type>::iterator start,typename const std::vector<Type>::iterator end)
{
//definition
}
现在,关于这个功能让我感到困惑的是它的参数。 为什么需要关键字typename? 因为如果我删除了两个类型名,我的编译器开始抱怨并说我应该在标识符'start'之前放一个')'。 如果我更改了参数以便函数使用两个向量而不是两个迭代器并删除了类型名,我的编译器就会停止抱怨(当然,该函数不再起作用)。
// perfectly acceptable!
template< class Type>
BTR<Type>* CreateEx( const std::vector<Type> start, const std::vector<Type> end)
所以我似乎需要关键字,因为该函数需要两个迭代器。 但是为什么在这样的情况下这个关键字是必要的呢?
答案 0 :(得分:5)
因为编译器不知道std :: vector&lt;类型&gt; :: 迭代器是std :: vector&lt;的类型或成员输入&gt;,因此需要以 typename 的形式提供一些帮助。