cout的操作员问题

时间:2010-04-29 06:30:56

标签: c++ polymorphism overloading cout

我有一个简单的包类,它被重载,所以我可以简单地输出包数据cout<<包裹名字。我还有两种数据类型,名称是字符串,运费是双倍的。

protected:
    string name;
    string address;
    double weight;
    double shippingcost;

ostream &operator<<( ostream &output, const Package &package )
{
    output << "Package Information ---------------";
    output << "Recipient: " << package.name << endl;
    output << "Shipping Cost (including any applicable fees): " << package.shippingcost;

问题出现在第4行(输出&lt;&lt;“收件人:......)。我收到错误”no operator“&lt;&lt;”匹配这些操作数“。但是,第5行很好。

我猜这与数据类型是包名称的字符串有关。有什么想法吗?

4 个答案:

答案 0 :(得分:14)

您必须包含错误的字符串标头。 <string.h><string>是两个完全不同的标准标题。

#include <string.h> //or in C++ <cstring>

这是针对C样式的以null结尾的char数组(如strcpystrcmp等)的函数。 cstring reference

#include <string>

那是std::stringstring reference

答案 1 :(得分:5)

您可能遗失#include <string>

答案 2 :(得分:1)

尝试在类声明中将operator<<声明为 friend

struct Package
{
public:
    // Declare {external} function "operator<<" as a friend
    // to give it access to the members.
    friend std::ostream& operator<<(std::ostream&, const Package& p);

protected:
    string name;
    string address;
    double weight;
    double shippingcost;
};

std::ostream&
operator<<(std::ostream& output, const Package& package)
{
    output << "Package Information ---------------";
    output << "Recipient: " << package.name << endl;
    output << "Shipping Cost (including any applicable fees): " << package.shippingcost;
    return output;
}

顺便说一句,使用与数据类型同名的变量名是非常糟糕的形式,除了不同的情况。这会对搜索和分析工具造成严重破坏。此外,拼写错误也会带来一些有趣的副作用。

答案 3 :(得分:-2)

用它来输出字符串..

输出&lt;&lt; “收件人:”&lt;&lt; package.name.c_str()&lt;&lt; ENDL;