4

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

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 行(输出 <<“收件人:...)。我收到错误“没有运算符“<<”与这些操作数匹配”。但是,第 5 行很好。

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

4

4 回答 4

14

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

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

这适用于 C 风格的以空字符结尾的字符数组(如strcpystrcmp)的函数。cstring 引用

#include <string>

那是为了std::string字符串引用

于 2010-04-29T12:11:27.837 回答
5

你很可能失踪了#include <string>

于 2010-04-29T06:46:09.343 回答
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;
}

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

于 2010-04-29T17:03:34.613 回答
-2

用它来输出字符串..

输出 << "收件人:" << package.name.c_str() << endl;

于 2010-04-29T06:48:18.113 回答