重载 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 &amp;operator&lt;&lt;(ostream&amp;, const Point&amp;); 【参考方案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&amp;。其他一些代码使您的编译器或 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 时未定义的引用的主要内容,如果未能解决你的问题,请参考以下文章

链接时未定义的引用 - 缺少库?

使用本地头文件时未定义的引用

尝试使用外部库时未定义的引用

在 c++ 对象上使用 extern 时未定义的引用,但不是整数类型

与共享库链接时未定义的引用

编译具有相同标头的 C 和 C++ 文件时未定义的引用