没有接线员的对手* 我正在读有效的C++(Scott Meyers),当试图编译本书中的以下代码时,获得错误“操作符*不匹配”:

没有接线员的对手* 我正在读有效的C++(Scott Meyers),当试图编译本书中的以下代码时,获得错误“操作符*不匹配”:,c++,C++,理性的 class rational { private: int num; int den; public: rational(int n = 0, int d = 1); int getNum() const {return num;} int getDen() const {return den;} }; rational.cpp #include "rational.h" rational

理性的

class rational
{
    private:
        int num;
        int den;
    public:
        rational(int n = 0, int d = 1);
        int getNum() const {return num;}
        int getDen() const {return den;}
};
rational.cpp

#include "rational.h"

rational::rational(int n,
                    int d)
    :num(n),
     den(d)
{}

const rational operator*(const rational &lhs, 
                         const rational &rhs)
{
    return  rational( lhs.getNum()*rhs.getNum(),
                      lhs.getDen()*rhs.getDen() );
}
main.cpp

#include "rational.h"
int main()
{
    rational r1(1,2);
    rational r2;
    r2 = 2*r1;
    r2 = r1*3;
    return 0;
}

有人能解释为什么会发生这种情况吗?

您忘记告诉用户您的运营商的存在:

理性的

class rational
{
    private:
        int num;
        int den;
    public:
        rational(int n = 0, int d = 1);
        int getNum() const {return num;}
        int getDen() const {return den;}
};
一般来说,在C和C++中,我们都讨论“定义”和“声明”。声明是注释,用于使某些内容对其他人可见,但其本身不起任何作用。定义是实际做某事的实体:

int foo();              // <- we call it "declaration"
int foo() { return 0; } // <- we call it foo's "definition"

这可以防止有时出现细微的错误,因为(在您的情况下)
rational
s可能是无意中创建的(请参见)。

您没有在头文件中声明
操作符*
,因此它在
main.cpp

中不可见。是否需要在.h文件中声明
操作符*
?如果你把所有的类和代码放在main.cpp中,它能工作吗?是的,它是在main.cpp中编译的。但是为什么呢?@Tony_M:关于你如何不知道声明和定义,却实现了操作符、constness和所有东西:这甚至是你自己的代码吗?/哎呀,你指的是斯科特·迈尔斯。我认为你应该先得到一本介绍性的书,而不是一本体现和强化你基本技能的书。+1为了让我查找'explicit'关键字@Sogger:在谷歌上搜索
explicit
关键字时要非常小心:(@MooingDuck-Ha-Ha!这就是为什么我在SO.Google-image-search上发布的链接:'explicit'=内核恐慌!错误:0x8000NSFW
explicit rational (int, int);