【发布时间】:2018-10-16 10:38:10
【问题描述】:
如果是这段代码,为什么foo(d) 调用模板函数而不是'base'函数?有没有办法让它调用基函数而不显式编写另一个函数重载?
template <class T> void foo(T val)
{
printf("template called\n");
}
class Base
{
};
void foo(const Base &val)
{
printf("Base called\n");
}
class Derived : public Base
{
};
int main() {
Derived d;
foo(d);
return 0;
}
【问题讨论】:
-
foo<Derived>是完全匹配的。您可能 SFINAE 模板功能是您不想重载。 -
您的非模板
foo()不完全匹配 - 它需要从const Derived &转换为const Base &)。模板化的foo()提供完全匹配 (foo<Derived>())。精确匹配(无需类型转换)优于需要类型转换的匹配。
标签: c++ templates derived-class