class Test{
public:
Test(int _a){a = _a;}
int a;
};
using namespace std;
int main() {
Test * first = new Test(3);
cout << "First is " << first << endl;
//Prints the address of the object, obvious
Test second(5);
cout << "Second is " << second << endl;
//Compile time error
return 0;
}
这听起来可能很荒谬,但为什么我在尝试打印第二个对象时出现此错误?
与"运算符<<不匹配(操作数类型为 "标准::basic_ostream"和"测试")
两个问题:
-
first
是一个指针,你正在输出它的数值,即内存地址。 - C++无法知道你想要什么
<< second
.
您需要正确访问a
:
// Change
cout << "First is " << first << endl;
cout << "Second is " << second << endl;
// To
cout << "First is " << first->a << endl;
cout << "Second is " << second.a << endl;
查找->
与 .
手段和指针。如果您只想访问该类并让它自动输出 a
的值,则需要重载运算符:
class Test{
public:
Test(int _a){a = _a;}
friend std::ostream& operator<<(std::ostream& os, const Test& t);
int a;
};
std::ostream& operator<<(std::ostream& os, const Test& t)
{
os << t.a;
return os;
}
最后一件事,您动态创建了first
因此请务必在从main
返回之前将其删除:
int main()
{
Test * first = new Test(3);
// Do the rest of your code here.
delete first;
return 0;
}
因为类型不同:
Test* first = new Test(3);
Test second(5);
实例first
是指针类型 Test*
。
虽然second
是Test
的实例。
该标准提供了一个打印指针的operator<<
版本,以便解释打印first
的原因。
第二个编译失败,因为没有函数声明(或定义):operator<<(std::ostream&, Test const&)
。您需要为您的类定义此函数(因为标准不知道您的类,因此不知道如何打印它)。
通常,您将输出运算符定义为类的友元:
class Test{
public:
Test(int _a){a = _a;}
int a;
friend std::ostream& operator<<(std::ostream& s, Test const& data)
{
return s << " {" << data.a << "} ";
}
};