Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数模板和派生类_C++_Templates_Derived Class - Fatal编程技术网

C++ 函数模板和派生类

C++ 函数模板和派生类,c++,templates,derived-class,C++,Templates,Derived Class,如果这是代码,为什么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

如果这是代码,为什么
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(T val)
{
printf(“称为\n的模板”);
}
阶级基础
{
};
无效foo(常数基准和val)
{
printf(“称为\n的基”);
}
派生类:公共基
{   
};
int main(){
导出d;
傅(丁),;
返回0;
}
为什么
foo(d)
调用模板函数而不是“base”函数

因为对于模板函数,
foo
T
被推断为
派生的
,所以它是精确匹配的。对于非模板,需要进行从派生到基本的转换

你可以用它;使函数模板仅适用于不是从
Base
(或
Base
本身)派生的类型

模板
std::启用\u if\u t>foo(t val)
{
printf(“称为\n的模板”);
}

foo
是一个精确匹配。您可能认为模板函数是您不希望重载的。您的非模板化
foo()
不是完全匹配的-它需要从
常量派生(
转换为
常量基(
)。模板化的
foo()
提供了精确匹配(
foo()
)。精确匹配(无类型转换)比需要类型转换的匹配更可取。谢谢。对于我的需求,这将导致严重的痛苦,因为我希望使用模板函数作为后备。SFINAE意味着模板必须明确知道哪些对象不能使用它,哪些类型的依赖关系颠倒了。我认为常规函数重载对我来说可能是更好的方法。@Roddy重载方法意味着您必须添加另一个重载,该重载以
派生的
为参数;否则,正如您所看到的,函数模板将在重载解析中获胜。是的,理解。但我现在计划完全抛弃模板函数,并为以前由模板处理的情况提供显式重载函数。
template <class T> 
std::enable_if_t<!std::is_base_of_v<Base, T>> foo(T val)
{
    printf("template called\n");
}