3

我正在练习一些 c++(试图离开 Java),我偶然发现了这个恼人的错误:错误:没有操作符 << 匹配这些操作数。我已经在这个网站上搜索了一个明确的答案,但没有运气,我确实发现我不是唯一一个。

这个错误在我的 .cpp 文件中,还有其他错误,但我现在不关心它们。

void NamedStorm::displayOutput(NamedStorm storm[]){
    for(int i = 0; i < sizeof(storm); i++){
        cout << storm[i] << "\n";
    }
}

“<<”出了点问题,我不确定发生了什么。

4

2 回答 2

5

由于您正在尝试cout一个类对象,因此您需要重载<<

std::ostream& operator<<(ostream& out, const NamedStorm& namedStorm)
于 2013-05-12T23:30:13.903 回答
2

您必须重载<<运算符才能将对象重定向到流中。

您可以作为成员函数重载,但在这种情况下,您必须使用语法object << stream才能使用该重载函数。

如果您希望使用此语法stream << object,则必须将<<运算符重载为“免费”函数,即不是 NamedStorm 类的成员。

这是一个工作示例:

#include <string>
#include <iostream>

class NamedStorm
{
public:
    NamedStorm(std::string name)
    {
        this->name = name;
    }

    std::ostream& operator<< (std::ostream& out) const
    {
        // note the stream << object syntax here
        return out << name;
    }

private:     
    std::string name;
};

std::ostream& operator<< (std::ostream& out, const NamedStorm& ns)
{
   // note the (backwards feeling) object << stream syntax here
   return ns << out;
}

int main(void)
{
    NamedStorm ns("storm Alpha");

    // redirect the object to the stream using expected/natural syntax
    std::cout << ns << std::endl;

    // you can also redirect using the << method of NamedStorm directly
    ns << std::cout << std::endl;

    return 0; 
}

从自由重定向重载中调用的函数必须是 NamedStorm 的公共方法(在这种情况下,我们调用的operator<<是 NamedStorm 类的方法),或者重定向重载必须是friendNamedStorm 类的一个才能访问私有字段。

于 2013-05-12T23:44:53.667 回答