错误:没有匹配的函数用于调用

时间:2011-09-01 07:18:20

标签: c++ templates

#include <iostream>
using namespace std;

template <typename x> x functionA (x, x);

int main ()
{
    functionA <double, double, double> (1, 1) << "\n";
}

template <typename x> x functionA (x arg1, x arg2)
{
    return arg1 + arg2;
}

此代码导致:

error: no matching function for call to ‘functionA(int, int)’

原因是什么?

5 个答案:

答案 0 :(得分:2)

这里有两件事不对。首先,您只需要为模板指定一种类型:

functionA<double>(1, 1)

其次,您错过了该行开头的std::cout

答案 1 :(得分:1)

这是错误的:functionA <double, double, double> (1, 1)。您尝试使用三个模板参数调用functionA(),而functionA的声明只有一个模板参数。

除此之外,电话会议后的<< "\n";也没有任何意义。

答案 2 :(得分:1)

函数模板只有一个模板参数,你将3模板参数传递给它:

functionA <double, double, double> (1, 1) << "\n";

为什么3模板参数?

只需写下:

functionA <double> (1, 1);

或者您可以简单地让编译器推导出模板参数,如:

functionA(1.0, 1.0);  //template argument deduced as double!
functionA(1, 1);     //template argument deduced as int!

答案 3 :(得分:1)

该行应为,

std::cout << functionA <double> (1, 1) << "\n";
^^^^^^^missing          ^^^^^^only 1 argument

因为functionA只接受1个模板参数,所以你应该只用一个模板参数显式调用

如果您的functionA就像

那样,则需要3个参数
template <typename x, typename y, typename z>
x functionA (y arg1, z arg2)
{
    return arg1 + arg2;
}

答案 4 :(得分:0)

您无需多次指定类型。 如果返回类型和函数的参数相同,那么您甚至不需要指定类型。下面的代码编译得很好。

std::cout << functionA(1, 1) << std::endl;