1. ホーム
  2. c++

[解決済み] friend宣言がテンプレート以外の関数を宣言している [重複] 。

2022-02-12 01:58:14

質問

以下のコードのような基本クラスがあります。 coutで使用するために、<<をオーバーロードしようとしています。 しかし、g++はこう言っている。

base.h:24: warning: friend declaration ‘std::ostream& operator<<(std::ostream&, Base<T>*)’ declares a non-template function
base.h:24: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning

クラス宣言/プロトタイプの << の後に <> を追加してみています。 しかし、その結果、次のようになります。 does not match any template declaration . 演算子の定義を完全にテンプレート化することを試みていますが(これは私が望んでいることです)、以下のコードで、演算子を手動でインスタンス化したものでしか動作させることができません。

ベース.h

template <typename T>
class Base {
  public:
    friend ostream& operator << (ostream &out, Base<T> *e);
};

ベース.cpp

ostream& operator<< (ostream &out, Base<int> *e) {
    out << e->data;
return out;
}

ヘッダーのbase.hにこれと同じようなものを入れるだけにしてほしいです。

template <typename T>
class Base {
  public:
    friend ostream& operator << (ostream &out, Base<T> *e);
};

template <typename T>
ostream& operator<< (ostream &out, Base<T> *e) {
    out << e->data;
return out;
}

プロトタイプの << と () の間に <> を入れれば解決するとネット上の他の場所で読みましたが、そうではありません。 これを1つの関数テンプレートにすることは可能でしょうか?

解決方法は?

変えたいようですね。

friend ostream& operator << (ostream& out, const Base<T>& e);

へ。

template<class T>
friend ostream& operator << (ostream& out, const Base<T>& e);