重载 cout 时未定义的引用
Posted
技术标签:
【中文标题】重载 cout 时未定义的引用【英文标题】:undefined reference while overloading cout 【发布时间】:2013-11-23 10:31:09 【问题描述】:我已经使用 dev c++ 定义了一个点类。然后我试图为这个类重载 cout。 虽然不使用它,但我没有收到任何错误。但是当我在 main 中使用它时,它给了我这个错误:
[Linker error] C:\Users\Mohammad\Desktop\AP-New folder\point/main.cpp:12: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, Point const&)'
//point.h
class Point
private:
double x;
double y;
double z;
public:
//constructors:
Point()
x=0;
y=0;
z=0;
Point(double xx,double yy,double zz)x=xx; y=yy; z=zz;
//get:
double get_x()return x;
double get_y()return y;
double get_z()return z;
//set:
void set_point(double xx, double yy, double zz)x=xx; y=yy; z=zz;
friend ostream &operator<<(ostream&,Point&);
;
//point.cpp
ostream &operator<<(ostream &out,Point &p)
out<<"("<<p.x<<", "<<p.y<<", "<<p.z<<")\n";
return out;
//main.cpp
#include <iostream>
#include "point.h"
using namespace std;
int main()
Point O;
cout<<"O"<<O;
cin.get();
return 0;
【问题讨论】:
错误信息提示point.h
中的代码其实一直是friend ostream &operator<<(ostream&, const Point&);
【参考方案1】:
这是因为您在声明和定义运算符时没有将Point
设为const
。更改您的声明如下:
friend ostream &operator<<(ostream&, const Point&);
还要在定义中添加const
:
ostream &operator<<(ostream &out, const Point &p)
out<<"("<<p.x<<", "<<p.y<<", "<<p.z<<")\n";
return out;
请注意,您发布的代码不需要const
-ness 的Point&
。其他一些代码使您的编译器或 IDE 认为引用了带有 const
的运算符。例如,像这样使用运算符需要const
cout << Point(1.2, 3.4, 5.6) << endl;
(demo)
由于上面的 sn-p 创建了一个临时对象,因此 C++ 标准禁止将对它的引用作为非常量传递。
与此问题没有直接关系,但您可能还想为各个坐标标记三个 getter const
:
double get_x() const return x;
double get_y() const return y;
double get_z() const return z;
这将允许您使用 getter 访问标记为 const
的对象上的坐标。
【讨论】:
这似乎是答案 @mohammadeslahisani 他们在课程的结尾部分谈到了const
:“在我们完成本课之前,还有一点很重要。重载的输出运算符friend ostream& operator<< (ostream &out, const Point &cPoint);"。非常量是否有效取决于调用(即您在main
中输入的代码)。
没有 const,在 eclipse ubuntu 中,它给了我朋友的答案!
@mohammadeslahisani 然后他在main
中做其他事情。
我知道它更好,但不使用它应该不会导致错误!以上是关于重载 cout 时未定义的引用的主要内容,如果未能解决你的问题,请参考以下文章