# no match for operator*

 Refresh December 2018 Views 4.1k time
2

I'm reading Effective C++ (Scott Meyers), and getting the error " no match for operator* " when trying to compile following code from this book:

rational.h

``````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;
}
``````

Can someone explain why this is happening ?

5

Вы забыли сказать своим пользователям о существовании вашего оператора:

rational.h

``````...
const rational operator*(const rational &lhs,
const rational &rhs);
...
``````

Как правило, в C, а также в C ++, мы говорим о «определений» и «декларации». Заявления являются аннотации, чтобы сделать что-то видимое для кого-то еще, но само по себе они ничего не делают. Определения являются entititiess, что на самом деле сделать что-то:

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

В вашем коде нет декларации `operator*`видны в main.cpp, так что вам нужно предоставить один где - то ( в идеале в вашем рациональны в заголовке).

Как советы стиля: Почти во всех случаях, если конструктор принимает встроенные типы, вы хотите сделать его явным:

``````explicit rational (int, int);
``````

Это предотвращает иногда тонкие ошибки , потому что (в вашем случае) `rational`s может быть непреднамеренно созданы (см автоматического преобразования ).

3

Вы не объявлен `operator*`в файле заголовка, так что не видно в `main.cpp`.