调用基函数时模板参数推断失败 下面的C++代码会产生编译错误。

调用基函数时模板参数推断失败 下面的C++代码会产生编译错误。,c++,templates,generic-programming,template-argument-deduction,C++,Templates,Generic Programming,Template Argument Deduction,编译器(gcc 5.2.0)抱怨在第15行找不到匹配的函数来调用“派生::测试函数()”;但是,如果将test_func()从基移到派生,则它编译时不会出错 class Base { public: int test_func(); }; class Derived : public Base { public: template <typename T> int test_func(T t); }; template <typename T> int

编译器(gcc 5.2.0)抱怨在第15行找不到匹配的函数来调用“派生::测试函数()”;但是,如果将test_func()从基移到派生,则它编译时不会出错

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;
}
类基{
公众:
int test_func();
};
派生类:公共基{
公众:
模板
int测试函数(T);
};
模板
int派生::test_func(T)
{
test_func();//第15行
返回0;
}
int Base::test_func()
{
返回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;
}
类基{
公众:
int test_func_diff_name();
};
派生类:公共基{
公众:
模板
int测试函数(T);
};
模板
int派生::test_func(T)
{
test_func_diff_name();
返回0;
}
int Base::test_func_diff_name()
{
返回0;
}

为什么会这样?在调用模板中的基函数时,C++中规定的约束是什么?有人能告诉我一些资源吗 通常最好为不同的函数指定不同的名称

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


或者使用base::test_func通过
将基类的名称显式引入当前类 

在C++中,派生类中没有重写基类函数但具有相同名称的函数隐藏基类中所有同名函数。

通常最好为不同的函数指定不同的名称

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


或者使用base::test_func通过
将基类的名称显式引入当前类

创建时,请不要包含行号。这将使我们很难自己复制和测试代码。如果要标记特定行,请在代码中添加注释。如果询问构建错误,请在问题中包括实际错误(完整、完整和粘贴为文本的副本)。
Base::test_func
无法通过名称查找找到-它被
Dervied
中声明的名称
test_func
隐藏。您可以在调用站点对其进行限定,如
Base::test_func()中所示。或者,您可以通过使用Base::test_func添加
,将名称纳入
派生的
范围
派生的
定义中的某处。这与模板无关。创建模板时,请不要包含行号。这将使我们很难自己复制和测试代码。如果要标记特定行,请在代码中添加注释。如果询问构建错误,请在问题中包括实际错误(完整、完整和粘贴为文本的副本)。
Base::test_func
无法通过名称查找找到-它被
Dervied
中声明的名称
test_func
隐藏。您可以在调用站点对其进行限定,如
Base::test_func()中所示。或者,您可以通过使用Base::test_func添加
,将名称纳入
派生的
范围
派生的
定义中的某处。这与模板无关返回到目前为止隐藏的函数…这些函数也必须具有相同的符号,对吗?@Pi No。如果没有,则它们是重载。您可能希望替代,然后是的,签名必须相同(只有少数例外)。但是为了重写,基类的函数必须声明为虚拟!谢谢!您还可以给我指出一些解释此规则背后合理性的文档吗?@Aconcagua对不起,我的意思是,如果名称相同,符号不同,它们也不会隐藏其他重载返回到目前为止隐藏的函数…这些函数也必须具有相同的符号,对吗?@Pi No。如果没有,则它们是重载。您可能希望替代,然后是的,签名必须相同(只有少数例外)。但是为了重写,基类的函数必须声明为虚拟!谢谢!你能给我指出一些解释这条规则背后合理性的文档吗?@Aconcagua对不起,我的意思是,如果名称相同,符号不同,它们也不会隐藏其他重载。