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;
}

您必须将后者设为 afriend才能访问私有数据成员。

于 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 函数track,或者,使操作员成为该类的朋友,track以便它可以track直接访问 的私有成员。

于 2012-11-25T15:53:30.783 回答