转换为模板

转换为模板

问题描述:

从C++入门明确的说法,我知道,模板的参数变量,只有两种转换进行:一个是常量转换,另一个是阵列/函数指针转换转换为模板

但是,当谈到明确的论点时,似乎一切都在改变。 假设我们有一个模板函数:

template <typename T> 
int compare(const T &a, const T &b) 
{ 
    // do comparison 
} 

如果没有明确的说法参与,这样的函数调用是非法的:

compare("foo", "foobar"); 

怪异的事情发生了(实际上,它可能不是很奇怪,但我做的不明白),当我们明确地做:

compare<std::string>("foo", "foobar"); 

看来,在第二个电话,“富”“foobar”转换为std::string,这是有争议的。

模板显式参数是否有特殊规则?谢谢。

+0

为什么这看起来有争议吗?通过提供显式的模板参数,您表明您希望将相应的'T'参数转换为'const std :: string&',它通过使用字符串文字的'std :: string'构造函数重载来完成。你期待什么行为?如果'T'没有转换构造函数(或者具有'explicit'),那么这不会发生。 –

+0

这是否意味着当我们用std :: string显式绑定T时,会生成实际的函数代码? –

在第一种情况下,编译器试图从给定的参数中推导出类型T。从第一个参数中,编译器推导出const char (&)[4](又名:4个字符数组的引用),从第二个参数获得const char (&)[7]。这两种类型不匹配,编译器无法弄清楚T应该是什么。

在第二个示例中,您明确指定T模板参数应为std::string。所以Tstd::string。编译器接受你给出的类型,并检查给定的函数参数是否与该类型匹配。在这种情况下,参数适合,因为"foo""foobar"可以隐式转换为std::string。 (const char[]降级到const char*,然后有一个构造函数可以构造std::stringconst char*

+1

+1:需要强调的是,对于模板参数推导,类型必须完美匹配(即不允许转换)。另外,如果参数的类型是'T'而不是'T const&',那么这些数组将衰变为指针,这也是可行的。 –