没有合适的构造函数可将“ int”转换为“ calc <int>”

时间:2018-11-28 17:54:50

标签: c++ operator-overloading

我有以下代码,我想将运算符重载应用于:

template < class T>
class calc
{
public:

    T multiply(T x, T y);
    T add (T x, T y);
};

template < class T>
T calc<T>::multiply(T k1, T k2)
{
    return k1 * k2;
}

template < class T>
T calc<T>::add(T k1, T k2)
{
    return k1 + k2;
}

int main()
{
    calc<int> c;
    std::cout << c.multiply(1, 5);
}

我尝试实现运算符重载,但出现错误:E0415不存在合适的构造函数来将“ int”转换为“ calc”。行:calc a(1);

#include <iostream>
using namespace std;

template < class T>
class calc
{
public:
    T x;
    T y;
};

template < class T>
calc<T> operator*(calc<T> const&  k1, calc<T> const&  k2)
{
    calc<T> ret;
    ret.x = k1.x * k2.x;
    return ret;
}

int main()
{
    calc<int> a(1);
    calc<int> b(5);
    calc<int> result;

    return 0;
}

1 个答案:

答案 0 :(得分:0)

使用类时,必须有一个称为构造函数的东西,它将初始化该类。这样,该类的变量将被设置并可以在成员函数中使用。构造函数没有返回类型(甚至没有void),并且总是以类的名称命名。因此,在您的情况下,代码将如下所示:

calc<T> (int value)
{
    x=value;
}

calc<T> (int value)
{
    y=value;
}

在您的第一个代码示例中,程序将调用由编译器自动为您创建的默认构造函数。看起来像这样:

calc<T> ()
{
    //since there is nothing to assign. Do nothing.
}

但是,如果您要在第二个代码示例中调用默认构造函数,则将为此x和y值分配默认值T 编译器。

现在有了构造函数,该对象中的项目就会保存。因此,a.x 或a.y等于发送到构造函数的值。 (在您的情况下为1)。