1

私はこのようなコードスニペットを持っています:

class track {

public:

struct time {
    unsigned minutes, seconds;

    std::ostream& operator<<(std::ostream& o) {
        o << minutes << "minute(s) " << seconds << " second(s)";
        return o;
    }
};

...

std::ostream& operator<<(std::ostream& o) {
    o << "title: " << title << " performer: " << performer << " length: " << length << std::endl;
    return o;
}

private:
std::string performer, title;
time length;
};

ただし、このコードをコンパイルすると、次のエラーが発生します。

no match for 'operator<< ...'

このコードの何が問題になっているのか教えていただけますか?

4

3 に答える 3

3

objクラスのオブジェクトでT一般的なストリーミング (例: cout << obj) をサポートする場合は、グローバル スコープで演算子を定義する必要があります。

std::ostream& operator<<(std::ostream& o, const T& obj) {
  ...
}

(関数がプライベート フィールドにアクセスする必要がある場合は、フレンドとして宣言できます)

コードのように、演算子をメンバーとして宣言した場合

std::ostream& T::operator<<(std::ostream& o)

あなたは本質的にこれを定義しています:

std::ostream& operator<<(T& obj, std::ostream& o)

次のように使用できます: obj << cout、しかし、それはおそらくあなたが望むものではありません!

于 2012-11-25T15:54:35.847 に答える
1

演算子は非メンバー関数として宣言する必要があります。

std::ostream& operator<<(std::ostream& o, const track::time& t) {
    return o << t.minutes << "minute(s) " << t.seconds << " second(s)";
}

std::ostream& operator<<(std::ostream& o, const track& t) {
    return o << "title: " << t.title << " performer: " << t.performer << " length: " << t.length;
}

friendプライベート データ メンバーにアクセスするには、後者を aにする必要があります。

于 2012-11-25T15:53:27.037 に答える
1

この演算子をクラスの外に置きたい:

std::ostream& operator<<(std::ostream& o, const track &t) {
    return o << "title: " << t.title() << " performer: " << t.performer()
      << " length: " << t.length() << std::endl;
}

もちろん、適切な getter 関数を class に追加するtrackか、代わりに operator を class のフレンドにして、の private メンバーに直接trackアクセスできるようにする必要があります。track

于 2012-11-25T15:53:30.783 に答える