【问题标题】:Template class method declaration failed模板类方法声明失败
【发布时间】:2014-06-10 05:54:51
【问题描述】:

我有一个类定义如下:

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


这里有什么问题?为什么它不起作用?

【问题讨论】:

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


    【解决方案1】:

    list 类模板的定义之外,node 不是已知类型。因此,必须为返回类型指定显式范围。参数类型不需要它,因为到那时,范围已知为list&lt;T&gt;

    使用

    template <typename T>
    typename list<T>::node* list<T>::iterate(node *first,node *last)
    {
      while(first->next!=last)
      {
        first = first->next;
      }
      return first;
    }
    

    【讨论】:

      【解决方案2】:

      当编译器看到node *就行了:

      node* list<T>::iterate(node *first,node *last)
      

      它不知道你在说什么:因为它无法理解第一个标记,所以它没有意识到这应该是在list&lt;T&gt; 的上下文中查找的类型名.

      在 C++03 中,修复方法是手动指定范围(事实上它是类型名,因为它是从属名称):

      typename list<T>::node* list<T>::iterate(node *first,node *last)
      

      在 C++11 中添加了新语法来避免这个问题,返回类型随后出现,以便可以正确地进行非限定名称查找:

      auto list<T>::iterate(node *first,node *last) -> node*
      {
          // ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-21
        • 1970-01-01
        • 1970-01-01
        • 2018-07-31
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        相关资源
        最近更新 更多