调用基函数时模板参数推导失败

template argument deduction failed when calling base function

本文关键字:失败 参数 基函数 调用      更新时间:2023-10-16

以下C++代码会产生编译错误。

编译器(gcc 5.2.0(在第15行抱怨说,它找不到用于调用"Derived::test_func(("的匹配函数;然而,如果test_func((从Base移到Derived,它编译时不会出错。

class Base {
public:
int test_func();
};
class Derived : public Base {
public:
template <typename T>
int test_func(T t); 
};
template <typename T>
int Derived::test_func(T t)  
{
test_func(); // line 15
return 0;
}
int Base::test_func()
{
return 0;
}

如果template函数调用基类中具有不同名称(与template函数名称不同(的其他函数,如以下代码所示,则它也可以编译得很好。

class Base {
public:
int test_func_diff_name();
};
class Derived : public Base {
public:
template <typename T>
int test_func(T t); 
};
template <typename T>
int Derived::test_func(T t)  
{
test_func_diff_name();
return 0;
}
int Base::test_func_diff_name()
{
return 0;
}

为什么会这样?C++中从模板调用基函数时指定的约束是什么?有人能给我指一些资源吗?

在C++中,派生类中不覆盖基类中函数但具有相同名称的函数隐藏基类中具有相同名称的所有其他函数。

通常最好给不同的函数取不同的名称。

如果你真的需要它,你可以通过完全限定名称来调用基类的函数,比如Base::test_func();

或者使用using Base::test_func;将基类的名称显式引入当前类