我有一个简单的包类,它被重载,所以我可以简单地输出包数据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行很好。
我猜这与数据类型是包名称的字符串有关。有什么想法吗?
答案 0 :(得分:14)
您必须包含错误的字符串标头。 <string.h>
和<string>
是两个完全不同的标准标题。
#include <string.h> //or in C++ <cstring>
这是针对C样式的以null结尾的char数组(如strcpy
,strcmp
等)的函数。 cstring reference
#include <string>
那是std::string
。 string 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;