嗨,我是迭代器中的一個類鏈表的朋友,但我不知道如何使用模板來做到這一點
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;
^
我嘗試了很多事情,比如我在朋友的論點之上放了一個模板,但沒有任何效果
uj5u.com熱心網友回復:
如果您想確保這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<double>成為朋友Iterator<int>可能不是你想要的。為什么不template <class T> friend class LinkedList提前宣告?這是因為嵌套模板必須具有不同的模板引數:不允許一個遮蔽另一個。
uj5u.com熱心網友回復:
有一些問題(請參閱下面的版本以查看它們的應用):
如果使用模板(如節點),則必須像這樣定義 T template <class T>
如果你參考了某個東西,它必須首先被宣告。Declared 只是型別,如int x;, class y;, 或<template class T> 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/321238.html
上一篇:為什么這個程式有邏輯錯誤
下一篇:生成字典序大于輸入的字串
