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

yan*_*uli 1 c++ templates generic-programming argument-deduction

以下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;
}
Run Code Online (Sandbox Code Playgroud)

如果模板函数使用不同的名称(与模板函数名称不同)调用Base类中的其他函数,如下面的代码所示,它也可以编译.

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;
}
Run Code Online (Sandbox Code Playgroud)

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

rus*_*tyx 5

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

通常最好给不同的功能赋予不同的名称.

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

或者将基类的名称明确地引入当前类中 using Base::test_func;