【问题标题】:Argument list for class template "calc" is missing缺少类模板“calc”的参数列表
【发布时间】:2023-03-07 12:37:01
【问题描述】:

我正在尝试将“calc”类修改为更通用以接受双精度或浮点数。

class calc {
public:
    int multiply(int x, int y);
    int add(int x, int y);
};

int calc::multiply(int k1, int k2)
{
    return k1 * k2;
}

int calc::add(int k1, int k2)
{
    return k1 + k2;
}

这是我下面的实现,但我有一个错误 E0441:类模板“calc”的参数列表丢失(行:calc c;)。

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 c;
    std::cout << c.multiply(1, 5);
}

如何将类转换为模板类和函数?

【问题讨论】:

标签: c++ templates math floating-point class-template


【解决方案1】:

编译器如何知道你想要什么样的calc?你必须告诉它:

calc<int> c;

calc<double> c;

或者...

【讨论】:

    【解决方案2】:

    是一种强类型语言,这意味着您必须在声明时完全指定所有类型。如果calc 是模板化的,则不能声明:calc c,因为它没有完全指定类型。您必须提供模板参数calc需要完整指定,例如:

    calc<double> c
    

    TonyK's answer 已经完全涵盖了这一点。我写这篇文章是为了评论你正在重新发明轮子。您正在编写的功能已经以以下形式提供:

    而且这些不需要类。因此,即使类似:cout &lt;&lt; 1 * 5 不能满足您的需求,您也需要通过创建函子对象以函数调用的形式来执行此操作:

    multiplies<double> foo;
    
    cout << foo(1, 5);
    

    Live Example

    【讨论】:

    • 这不是plusmultiplies 的用途——在这种情况下,它们与+* 相同。 OP想要的是例如一个calc&lt;float&gt; 类,它返回一个float,即使两个参数都是int
    • @TonyK 我看到的函数定义是:T multiply(T k1, T k2) { return k1 * k2; } 因此与multiplies 的签名完全匹配,除非我误解了什么?
    • 不,它们不一样:multiplies(3,5) 将返回15;但calc&lt;float&gt;::multiply(3,5) 将返回15.0f。更重要的是,divides(3,5) 将返回0;但calc&lt;float&gt;::divide(3,5) 将返回0.6f
    • @TonyK 好吧,它是一个仿函数,所以在再次查看它时,由于您的评论,我确实发现了这个错误 :( 但是当正确初始化时,它确实完全取代了 calc。我添加了一个示例来演示......并确保我做对了:J
    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    相关资源
    最近更新 更多