4

オーバーロードされた単純なパッケージ クラスがあるため、cout << packagename で簡単にパッケージ データを出力できます。また、文字列である name と double の送料の 2 つのデータ型があります。

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 行目 (output << "Recipient:...") で発生しています。「演算子 "<<" がこれらのオペランドに一致しません」というエラーが表示されます。ただし、5 行目は問題ありません。

これは、データ型がパッケージ名の文字列であることに関係していると思います。何か案は?

4

4 に答える 4

14

間違った文字列ヘッダーを含めている必要があります。<string.h><string>は、2 つの完全に異なる標準ヘッダーです。

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

これは、C スタイルのヌル終了文字配列 ( など) の関数用strcpyですstrcmpcstring リファレンス

#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

これを使用して文字列を出力します。

output << "受信者: " << package.name.c_str() << endl;

于 2010-04-29T06:48:18.113 に答える