テンプレート リンク リスト内で << 演算子をオーバーロードしようとしています。
つまり、1 つの抽象クラスと、それを継承した 2 つの派生クラスがあります。dynamic_castを使用すると、3つのクラスすべてに演算子 << が記述され、うまく機能します。
しかし、テンプレート リンク リスト内で演算子 << を使用しようとすると、何らかの理由でアドレスまたはリンカー エラーが発生します。
抽象クラス - プレーヤー
#ifndef PLAYER_H_
#define PLAYER_H_
#include <iostream>
class Player {
private:
const char* m_name;
int age;
public:
static int numofPlayers;
Player(const char*,int);
virtual ~Player();
friend std::ostream& operator<<(std::ostream& out, const Player &p);
};
std::ostream& operator<<(std::ostream& out, const Player &p);
#endif
派生クラスの 1 つ
class Goalkeeper:public Player {
private:
int Saved_Goals;
int Shirt_Number;
public:
Goalkeeper(const char* name,int age, int number);
~Goalkeeper();
friend std::ostream& operator<<(std::ostream& out, const Goalkeeper& s);
};
std::ostream& operator<<(std::ostream& out, const Goalkeeper& s);
ベースと派生の両方の << 演算子はうまく機能します! テンプレートのリンクされたリストでそれらを使用しようとした場合にのみ、データではなくアドレスを取得します。
テンプレート リンク リスト
template <typename T>
class Node {
T* m_data;
Node* next;
public:
Node ();
Node(T*, Node<T>*);
~Node();
T* getData ()const {return this->m_data;};
Node* getNext()const{return this->next;};
template <typename T>
friend std::ostream& operator<<(std::ostream &output, const Node<T>& Nd );
};
template <typename T>
std::ostream &operator << (std::ostream &output,const Node<T>& Nd ) {
output<<Nd.m_data<<endl;
return output;
}
template <typename T>
void List<T>::PrintMe() const {
Node<T>* temp=this->head;
while(temp) {
cout<<*temp;
temp=temp->getNext();
}
}