C ++模板函数重载解析

莉雅鲁斯

我有以下代码:

#include <iostream>

template <typename T>
void f (T) { std::cout << "f(T)" << std::endl; }

template <typename T>
void f (bool) { std::cout << "f(bool)" << std::endl; }

int main ( )
{
    f(true);        // #1 prints f(T)
    f<bool>(true);  // #2 prints f(bool)
}

#1线路的呼叫f(T),而#2线路的呼叫f(bool)

为什么会这样?选择重载模板函数的规则是什么?

更新

我了解到,在第一次调用中,编译器T在尝试调用第二个函数时无法推断,因此选择了第一个。

在第二个调用中,第二个功能被认为是在gcc上更好的匹配,而第一个功能是在VS2013下选择的。谁在这里做正确的事?顺便说一下,我仍然对该过程的完整描述感兴趣。

尼科斯(Nikos Athanasiou)

非专业功能模板也称为基础模板。基本模板可以是专门的。看看在不同情况下会调用哪个的重载规则非常简单,至少在较高级别上如此:

  • 非模板功能是一等公民。与参数类型以及任何功能模板相匹配的普通旧非模板函数将在原本就很好的函数模板上进行选择。

  • 如果没有一等公民可供选择,那么至少要和二等公民一样好,然后使用功能基础模板作为第二等公民的参考。根据一组相当合理的说法,选择哪个功能基础模板取决于哪个匹配最合适,并且是“最专业的”(重要说明:“专业化”的这种使用与模板专业化毫无关系;这只是一个不幸的口语化)奥术规则:

    • 如果很明显有一个“最专业的”功能库模板,那么该模板就会被使用。如果该基本模板恰好专用于所使用的类型,则将使用该特殊化,否则将使用以正确类型实例化的基本模板。

    • 否则(如您的情况),如果“最专业”的函数库模板有联系,则该调用是模棱两可的,因为编译器无法确定哪个更合适。程序员将必须做一些事情以限定调用并说出需要哪个。

    • 否则,如果没有可以匹配的函数库模板,则调用是错误的,程序员将不得不修复代码。

如果要自定义函数基础模板,并希望该自定义参与重载解析(或在完全匹配的情况下始终使用),请使其成为普通的旧函数,而不是专门化的函数。并且,如果您确实提供了重载,请避免也提供专业化知识。

以上是从提取职位通过香草萨特和突出显示的子弹,你可以看到你的问题的根源

编辑

如果您尝试(不要这样做)在Visual Studio 2012中使用上述代码,则会得到

致命错误LNK1179:无效或损坏的文件:重复的COMDAT'?? $ f @ _N @@ YAX_N @ Z'

如此处所述,是因为

您做了一些无效的C ++“欺骗”,它通过了编译器,但是您现在有了一个无效的* .obj,它使链接程序阻塞了。

而以下行应归咎于

f(true);        // #1 prints f(T)

因此答案中的歧义没有保证的解决方案

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++模板函数重载解析错误

来自分类Dev

C ++模板函数的重载

来自分类Dev

模板函数重载C ++

来自分类Dev

C ++中的模板函数重载

来自分类Dev

C ++重载函数作为模板参数

来自分类Dev

模板参数上的C ++函数模板重载

来自分类Dev

C ++重载函数和函数模板-不同的行为?

来自分类Dev

C ++重载函数和函数模板-不同的行为?

来自分类Dev

C ++重载解析,用户定义的转换和功能模板

来自分类Dev

C ++模板专业化:意外的函数重载查找结果

来自分类Dev

C ++模板和对重载函数的歧义调用

来自分类Dev

分配值或回调函数的C ++重载模板

来自分类Dev

C ++:可变参数模板和函数重载

来自分类Dev

C ++模板函数能否在返回参数上重载?

来自分类Dev

c ++模板-多个重载函数实例与参数列表匹配

来自分类Dev

C ++函数模板重载:空括号与显式int

来自分类Dev

C ++ gcc函数模板重载编译器问题

来自分类Dev

C ++中的模板专业化和函数重载

来自分类Dev

C ++模板和对重载函数的歧义调用

来自分类Dev

函数重载不适用于 C++ 中的模板?

来自分类Dev

C ++:重载的模板别名

来自分类Dev

使用 sfml 向量的模板函数重载解析

来自分类Dev

C ++函数解析选择普通函数的模板版本

来自分类Dev

c ++:函数不能重载

来自分类Dev

重载递归函数C ++

来自分类Dev

C + +成员函数重载&(&)

来自分类Dev

函数重载C ++指针

来自分类Dev

函数重载C ++?

来自分类Dev

根据C ++模板函数的参数类型解析为不同的类型