调用基本函数

时间:2018-07-12 13:03:33

标签: 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;
}

如以下代码所示,如​​果模板函数使用不同的名称(与模板函数的名称不同)调用基类中的其他函数,则也可以正常编译。

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 ++中指定了哪些约束?有人可以指出我一些资源吗?

1 个答案:

答案 0 :(得分:5)

在C ++中,派生类中的函数不会在基类中 override 函数,但具有相同的名称​​ hide ,所有其他在基类中具有相同名称的函数课。

通常最好给不同的函数起不同的名字。

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

或者使用using Base::test_func;

显式地将基类的名称引入当前类中
相关问题