1

テンプレート リンク リスト内で << 演算子をオーバーロードしようとしています。

つまり、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();
  }
}
4

1 に答える 1

3

ポインターを印刷しています。逆参照演算子を使用して値を出力します。

output<<*(Nd.m_data)<<endl;

また、投稿する前にコードをインデントしてください!

コメントでの質問:

現在はデータを出力していますが、何らかの理由で派生クラスではなく、基本クラスに対してのみ出力されています

メソッドのオーバーロードは式の静的型に基づいているためです。したがって、 のList<Base>場合、呼び出されるメソッドは ですoperator<<(ostream&, const Base&)。a を試すList<Derived>と、コードが機能します。両方の種類の要素を含むリストを機能させるには、基本クラスの operator<< で作業を行う仮想関数呼び出しが必要です。

于 2013-01-26T22:53:33.343 に答える