调用基函数时模板参数推导失败
template argument deduction failed when calling base function
以下 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;
}
如果模板函数以不同的名称(与模板函数不同的名称)调用 Base class 中的其他函数,如以下代码所示,它也可以正常编译。
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++ 中,派生 classes 中的函数不会 覆盖 基础 classes 中的函数,但它们具有相同的名称 隐藏 基class.
中所有其他同名函数
通常最好给不同的函数起不同的名字。
如果你真的需要它,你可以通过完全限定名称来调用基础class'函数,例如Base::test_func();
或者显式地将基础 class' 名称引入当前 class 和 using Base::test_func;
以下 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;
}
如果模板函数以不同的名称(与模板函数不同的名称)调用 Base class 中的其他函数,如以下代码所示,它也可以正常编译。
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++ 中,派生 classes 中的函数不会 覆盖 基础 classes 中的函数,但它们具有相同的名称 隐藏 基class.
中所有其他同名函数通常最好给不同的函数起不同的名字。
如果你真的需要它,你可以通过完全限定名称来调用基础class'函数,例如Base::test_func();
或者显式地将基础 class' 名称引入当前 class 和 using Base::test_func;