我是C ++编程的新手,并且无法实现此运算符重载。它给出的错误是没有操作员"<<&#匹配这些操作数。
class class1{
public:
bool operator==(class1 &);
friend ostream & operator<<(ostream &, class1 &);
private:
string name;
};
/*Friend ostream & operator <<*/
ostream & operator << (ostream & os, class1 & obj){
os << obj.name;
return os;
}
有人提到我需要另一个重载运算符,但我无法弄清楚如何让它与另一个重载运算符一起工作
答案 0 :(得分:1)
以下是您的代码的情况;您的类中有一个私有成员字符串变量,其中没有外部对象可以设置此变量。您的类不包含已定义的构造函数或设置方法。当我尝试你的代码时,我不得不改变你的操作符声明和定义:
std::ostream& operator<<( std::ostream& os, class1& obj );
到此:
std::ostream& operator<<( std::ostream& os, const class1& obj );
为了编译它。但是,在构建项目时,我收到了一个未解析的标识符的链接器错误。这里发生的事情是你声明作为你的类对象的朋友的ostream对象确实知道私有成员字符串但它不能对它做任何事情,因为这个字符串是空的或无效的。我把你的班级改为:
#include <conio.h>
#include <string>
#include <iostream>
class class1 {
friend std::ostream& operator<<( std::ostream& out, const class1& other );
private:
std::string m_strName;
public:
explicit class1( std::string& strName ) : m_strName( strName ) {}
void setName( std::string& strName ) { m_strName = strName; }
std::string getName() const { return m_strName; }
};
std::ostream& operator << ( std::ostream& out, class1& obj ) {
out << obj.m_strName << std::endl;
// out << obj.getName() << std::endl;
return out;
}
int main() {
class1 a( std::string( "class1" ) );
std::cout << a << std::endl;
std::cout << "Press any key to quit" << std::endl;
_getch();
return 0;
}
这将正确编译,构建,链接和执行,并显示适当的文本和退出值为0,没有错误。我在Win7机器上使用MSV2013。主要问题是,由于您的类在构造时无法填充其字符串成员,因此ostream操作符对象无法解析正在使用的变量。
答案 1 :(得分:0)
friend ostream & operator<<(ostream &, const class1 &);
public:
bool operator==(const class1& x, const class1& y);
或
public:
bool operator==(const class1& x, const class1& y);
ostream & operator<<(ostream &, const class1 &);
make operator&lt;&lt; const的第二个参数可能有帮助
ostream & operator << (ostream & os, const class1 & obj){
os << obj.name;
return os;
}
答案 2 :(得分:0)
重载operator<<(std::ostream&, std::string)
实际上是由#include <string>
定义的。
虽然std::string
也由该标头定义,但如果您没有包含该标头,则仍可以定义std::string
,但不能定义此运算符重载。
C ++标准要求某些标头提供某些功能,但它并不禁止该功能也由另一个标头提供。在您的情况下,编译器/库编写器已经决定通过定义std::string
来最容易地在另一个头中实现其他功能,但它可以通过使用定义std::string
的单独文件来完成此操作。包括<string>
和其他标题。