它不知道如何显示分数,添加这个:
std::ostream& operator<<(std::ostream& stream, const Fraction& frac) {
stream<<"Do something with frac here, like output num/denom\n";
return stream;
}
尽管它现在不会抱怨您的 cout 行,但当您修复此错误时它会抱怨,因为它不知道如何在 std::ostream 和 Fraction 上执行 <<。
不是这个 - 来自原始答案
您的错误可能是那些“从这里使用”错误标记之一,它告诉您它在哪里感到困惑,它可能试图将 frac 打印为 int ......是的。
实际答案
当你说Fraction A = B*C;
编译器看到Fraction A = AnotherFraction;
它可以做的事情Fraction A;
(默认构造函数)时,Fraction::operator=(Fraction&);
或者它可以在这种情况下使用你返回的临时值(移动赋值)。
C++ 允许一级隐式转换,在某处你有“Fraction::Fraction(int);” - 一个采用 int 的构造函数,C++ 想要将您的 Fraction 转换为 int,并使用该 int 构造一个新的 Fraction。
它在抱怨,因为它不能。给它一个复制构造函数,参见规则 3(现在规则 5),你应该总是有你的赋值运算符和复制构造函数,而不是只有一个(没有很好的理由)和 C++11 你的赋值 r-value 运算符和"" 构造函数。
结束时
我们需要你的构造函数,隐式转换给你的错误看起来很奇怪,因为“为什么是 int”,但出于某种原因,C++ 想要使用 Fraction::Fraction(int),我知道你所说的存在这种情况,它很沮丧,因为它不能去分数-> int(它想做分数-> int->分数)
笔记
这就是为什么 C++ 有一个沉重的学习曲线,因为它是如此强大(它对隐式转换所做的毫无疑问是一件好事!)您可能会遇到错误,这些错误会告诉您它在哪里混淆而不是实际错误。就像当您有一个带有拼写错误的 operator<< 并且它试图将其与标准 operator<< 之一匹配时,您会得到一个 4 页的原因,说明您所说的为什么是错误的以及它如何无法实例化某个 (在人类看来无关)模板。
附录
template<class T>
class Ratio {
public:
Ratio(): top(0), bottom(1) {}
Ratio(T& from): top(from), bottom(1) {}
Ratio(T& top, T& bottom): top(top), bottom(bottom) {}
Ratio(T&& from): top(from), bottom(1) {}
Ratio(T&& top, T&& bottom): top(top), bottom(bottom) {}
Ratio& operator=(Ratio& from) {
top = from.top;
bottom = from.bottom;
}
Ratio& operator=(Ratio&& from) {
top = from.top;
bottom = from.bottom;
}
Ratio(const Ratio& from): top(from.top), bottom(from.bottom) {}
Ratio(Ratio&& from): top(from.top), bottom(from.bottom) {}
~Ratio() {}
const T& getTop() const { return top; }
const T& getBottom() const { return bottom; }
T& getTop() { return top; }
T& getBottom() { return bottom; }
Ratio operator*(const Ratio& rhs) const { //we are the left hand side
T newTop = rhs.top*this->top;
T newBottom = rhs.bottom*this->bottom;
Ratio result(newTop,newBottom);
return result;
}
private:
T top;
T bottom;
};
template<class T>
std::ostream& operator<<(std::ostream& stream, const Ratio<T>& ratio) {
stream<<ratio.getTop()<<"/"<<ratio.getBottom();
return stream;
}
typedef Ratio<int> Fraction;
int main(int,char**) {
Fraction a;
std::cout<<"A: "<<a<<"\n";
Fraction b(1);
std::cout<<"B: "<<b<<"\n";
Fraction c = a*b;
std::cout<<"A*B=C: "<<c<<"\n";
Fraction d(5,3);
std::cout<<"Look! "<<d*d<<"\n";
return 0;
}
这样可行!