模板,没有匹配函数来调用错误

时间:2017-04-28 18:26:16

标签: c++ function templates operators

我已经制作了一个可以很好但一行的代码。这给我带来了麻烦。在它所说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;
}

2 个答案:

答案 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