【问题标题】:Template friend error, error: template argument required for 'class LinkedList'模板朋友错误,错误:“类 LinkedList”需要模板参数
【发布时间】:2021-12-05 00:04:18
【问题描述】:

您好,我想成为迭代器中的类链表的朋友,但我不知道如何使用模板来实现这一点

class Iterator{
    private:
        node<T>* v;

    public:
        Iterator(node<T>* u){
            v = u;
        }

        T& operator*(){
            return v->element; 
        }
        friend class LinkedList;


};

template <class T>
class LinkedList{
    public:
        node<T>* head;
        node<T>* tail;
}

我不断收到错误

doubleLinkedList.cpp: In instantiation of 'class Iterator<int>':
doubleLinkedList.cpp:214:26:   required from here
doubleLinkedList.cpp:35:18: error: template argument required for 'class LinkedList'
         node<T>* v;
                  ^

我尝试了很多方法,比如我将模板放在朋友参数之上,但没有任何效果

【问题讨论】:

  • 我想你的迭代器也是一个模板。如果你这样做 friend class LinkedList&lt;T&gt; 是否有效?
  • 您的代码没有定义nodeT
  • 您只能在模板本身的定义中省略模板参数。

标签: c++ class friend


【解决方案1】:

如果您想确保LinkedList 只是Iterator 的朋友,如果他们共享相同的T,那么您可以转发声明LinkedList 并将T 特化为朋友:

template <class T> class LinkedList;

template <class T>
class Iterator{
    friend class LinkedList<T>;
};

template <class T> class LinkedList{};

如果您希望每个LinkedList 都成为迭代器的朋友,您也可以编写

template <class T>
class Iterator{
     template <class U> friend class LinkedList; // can't use T here
};

template <class T> class LinkedList{};

但是LinkedList&lt;double&gt; 成为Iterator&lt;int&gt; 的朋友可能不是你想要的。为什么不template &lt;class T&gt; friend class LinkedList 没有前向声明?这是因为嵌套模板必须具有不同的模板参数:不允许一个遮蔽另一个。

【讨论】:

    【解决方案2】:

    有一些问题(请参阅下面的版本以查看它们的应用):

    如果使用模板(如节点),则 T 必须定义为 template &lt;class T&gt;

    如果你引用了某些东西,它必须首先被声明。声明的只是类型,如int x;class y;&lt;template class T&gt; class z; 定义——所有细节都可以在以后出现:int x=7 或完整的类定义。 friend 也需要这样做。

    而且,有时这仍然让我感到困惑,所有类都必须以 ; 结束其定义

    template <class T> class node; // this has to be declared or defined first
    
    template <class T>class LinkedList; // this is needed to reference as friend later
    
    template <class T> // this is needed because to pass template args, the class must be templated as well 
    class Iterator {
        private:
            node<T>* v;
    
        public:
            Iterator(node<T>* u) {
                v = u;
            }
    
            T& operator*() {
                return v->element; 
            }
            friend class LinkedList<T>;
    };
    
    template <class T>
    class LinkedList{
        public:
            node<T>* head;
            node<T>* tail;
    }; // remember the closing semi colon
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 2017-05-05
      • 1970-01-01
      相关资源
      最近更新 更多