我有一个如下定义的类:
template <typename T> class list
{
private:
struct node
{
T val;
node *next;
} *origin;
node* iterate(node *first,node *last);
(...) code
};
使用此处定义的函数方法:
template <typename T>
node* list<T>::iterate(node *first,node *last)
{
while(first->next!=last)
{
first = first->next;
}
return first;
}
由于该类正在使用模板功能,因此所有内容都写在标题中。
问题在于,当我尝试编译时,它给了我这些错误:
error C2143: syntax error : missing ';' before '*'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2065: 'T' : undeclared identifier
error C2923: 'list' : 'T' is not a valid template type argument for parameter 'T'
所有这4个错误都表明了这一行:
template <typename T>
node* list<T>::iterate(node *first,node *last)
在所有情况下,函数都是从类中调用的:
node* aux = iterate(origin,origin);
这是什么问题?为什么不起作用?
答案 0 :(得分:3)
在list
类模板的定义之外,node
不是已知类型。因此,必须为返回类型指定显式范围。参数类型不需要它,因为到那时,范围已知为list<T>
。
使用
template <typename T>
typename list<T>::node* list<T>::iterate(node *first,node *last)
{
while(first->next!=last)
{
first = first->next;
}
return first;
}
答案 1 :(得分:2)
当编译器在行上看到node *
时:
node* list<T>::iterate(node *first,node *last)
它不知道你在说什么:因为它无法理解第一个令牌,所以它没有意识到这应该是{{1的上下文下查找的类型名称}}
在C ++ 03中,修复是手动指定范围(以及它是一个类型名称,因为它是一个依赖名称):
list<T>
在C ++ 11中添加了新语法以避免此问题,其中返回类型随后出现,以便可以正确地进行非限定名称查找:
typename list<T>::node* list<T>::iterate(node *first,node *last)