我已经制作了一个可以很好但一行的代码。这给我带来了麻烦。在它所说k = Money<double>().increment (k,m); // this should've printed 6.25
的行上它不起作用。当你评论出来并运行代码......一切正常。怎么了?我该怎么办呢?
感谢您的帮助。
控制台中的错误说:
main.cpp:59:36:错误:'Money :: increment(Money&amp;,Money&amp;)'没有用于调用错误的匹配函数 main.cpp:59:36:info:候选人是:
main.cpp:41:3:info:T Money :: increment(T,T)[with T = double]
main.cpp:41:3:info:参数1从'Money'到'double'没有已知的转换
而且......候选人也是空的。 正如我所说,没有那条线,一切都很完美。
以下是代码:
#include <iostream>
using namespace std;
template <class T>
class Money {
private:
T dollar, cent;
public:
Money(T a, T b){
dollar = a;
cent = b;
}
Money(){
dollar = 0;
cent = 1;
}
Money& operator +=(const Money& v){
dollar += v.dollar;
cent += v.cent;
return (*this);
}
Money operator +(const Money& v) const{
Money temp(*this);
temp += v;
return temp;
}
Money& operator =(const Money& v){
dollar = v.dollar;
cent = v.cent;
return (*this);
}
T increment(T value, T amount);
};
template <class T>
T Money<T>::increment(T value, T amount)
{
T result = 0;
result += value + amount;
cout << result << " $" << endl;
return result;
}
int main()
{
int a = 2;
double b = 3.45;
Money<double> k(3,75);
Money<double> m(2,50);
a = Money<double>().increment (a,5); // this prints 7
b = Money<double>().increment (b,4.5); // this prints 7.95
k = Money<double>().increment (k,m); // this should've printed 6.25
return 0;
}
答案 0 :(得分:5)
T
上下文中的{p> Money<double>
为double
,但您没有将double
传递给Money<double>::increment()
,而是通过Money<double>
实例,并且Money<double>
到double
没有隐式转换。
有几种方法可以解决这个问题。
Money<T>::operator T() const;
。这将提供从Money<double>
到double
的隐式转换,您可以定义它的作用。编译器将在您传递的Money<double>
个实例上自动调用此运算符。Money<T>::increment(Money const &, Money const &);
添加重载。Money<T>::increment
本身就是模板功能。从您的代码中不清楚您应该采用哪种方法,但其中一种方法可以解决此特定错误。
答案 1 :(得分:1)
The answer by @cdhowie已经解决了您帖子中的问题。
这个答案质疑函数increment
的语义。
您正在使用:
a = Money<double>().increment (a,5);
这与
无异a += 5;
Money<double>()
对象完全没有用处。它不会递增任何Money
个对象。这就是为什么它成为该类的成员函数是没有意义的。要递增一个Money
对象,可以使用以下语法:
int a = 2;
double b = 3.45;
Money<double> k(3,75);
Money<double> m(2,50);
Money<double> n(4,20);
k += a; // Increment k.dollars by a
m += k; // Increment m by k
m += b; // Increment m.dollars by b
k.increment(n); // Increment k by n
虽然我不知道您在使用k.increment(n)
时想要使用k += n
的原因。
以下是您的课程的修订版本,其中包含main
。
#include <iostream>
using namespace std;
template <class T>
class Money {
private:
T dollar, cent;
public:
Money(T a = {}, T b = {}) : dollar(a), cent(b) {}
Money& operator +=(const Money& v){
dollar += v.dollar;
cent += v.cent;
return (*this);
}
Money operator +(const Money& v) const{
Money temp(*this);
temp += v;
return temp;
}
Money& operator =(const Money& v){
dollar = v.dollar;
cent = v.cent;
return (*this);
}
friend std::ostream& operator<<(std::ostream& out, Money const& m)
{
return (out << "Dollors: " << m.dollar << ", Cents: " << m.cent);
}
};
int main()
{
int a = 2;
double b = 3.45;
Money<double> k(3,75);
Money<double> m(2,50);
Money<double> n(4,20);
k += a; // Increment k.dollars by a
m += k; // Increment m by k
m += b; // Increment m.dollars by b
k += n; // Increment k by n
std::cout << m << std::endl;
std::cout << k << std::endl;
return 0;
}
输出:
Dollors: 10.45, Cents: 125
Dollors: 9, Cents: 95