模板类方法声明失败

时间:2014-06-10 05:54:51

标签: c++ class templates methods syntax-error

我有一个如下定义的类:

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);


这是什么问题?为什么不起作用?

2 个答案:

答案 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)