【问题标题】:Unqualified IDs and Template Classes不合格的 ID 和模板类
【发布时间】:2013-08-26 03:02:38
【问题描述】:

我一直在为循环列表编写一个自定义类,称为 CList。我一直基于很久以前完成的一项家庭作业,其中有很多复制粘贴,所以我不完全记得我写过的所有作品。

无论如何,简单地尝试包含 .h 文件会导致我在 using namespace std 行上出现错误:

main.cpp:11: error: expected unqualified-id before ';' token

还有两个错误指向我的代码中的一个函数:

In file included from main.cpp:9:
CList.h:119: error: non-template 'CIterator' used as template
CList.h:119: note: use 'CList<T>::template CIterator' to indicate that it is a template

这是有问题的函数:

template <class T> 
typename CList<T>::CIterator<T> CList<T>::push(T const& v) 
{
    size++;  
    Node<T>* p = new Node<T>(v);

    if (this -> size_ == 1)
    {
        head = p;
        tail = p;
        p -> next = p;
        p -> prev = p;
    }
    else
    {
        tail -> next = p;
        p -> next = head;
        p -> prev = tail;
        head -> prev = p;
        tail = p;
    }

    return CIterator(p);
}

我真的不明白这里的错误是什么。我告诉该函数返回 CList 的 CIterator,并表示该函数是 CList 类的一部分。这就是我阅读该行时所理解的

typename CList<T>::CIterator<T> CList<T>::push(T const& v) 

为什么明明T是模板,它却认为CIiterator是模板?我只是一头雾水。

【问题讨论】:

    标签: c++ templates iterator


    【解决方案1】:

    错误消息指出CIterator&lt;T&gt; 不被视为模板。这是因为它是一个依赖名称,编译器只能在实例化时真正确定它确实是一个嵌套模板。解决这个问题的方法是告诉编译器它实际上是一个模板:

    template <class T> 
    typename CList<T>::template CIterator<T> CList<T>::push(T const& v) 
    {
        ...
    }
    

    编译器不知道CList&lt;T&gt;::CIterator&lt;T&gt; 是否是模板的原因是类CList&lt;X&gt; 可以专门用于某些类型X 内部没有嵌套模板。但是,编译器仅在模板实例化时才发现这些特化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 2017-04-03
      • 2020-07-07
      相关资源
      最近更新 更多