为什么显式模板实例化不起作用

Why the explicit template instantiation doesn't work

本文关键字:实例化 不起作用 为什么      更新时间:2023-10-16

您能否解释一下,为什么显式模板实例化在这里不起作用?

template <typename T>
bool IsEqual(T v1, T v2) {
return v1 == v2;
}
template bool IsEqual<double>(double a, double b);
int main() {  
int c = 4;
double d = 4.0;
IsEqual(c,d)
return 0;
}

代码生成的错误是:

note:   template argument deduction/substitution failed:
note:   deduced conflicting types for parameter 'T' ('int' and 'double')

如果该函数不是模板函数,那么一切正常。因此,我希望显式实例化来创建相同的函数。

bool IsEqualT (double a, double b) {
return a == b;
}

手动踩踏

template bool IsEqual<double>(double a, double b)

不会阻止编译器在

IsEqual(c,d)

它只是告诉编译器,无论它可能消灭什么其他函数,你都希望它在double秒内消灭该函数。

因此,由于您仍然要进行模板参数推导,并且intdouble不同,因此您会收到编译器错误。 您必须将c转换为双精度值,或者重写函数以具有 2 个模板参数,以便它可以采用两种不同的类型。

模板参数推导不关心显式实例化或重载解析。

如果要调用IsEqual或将其声明更改为

template <typename T, typename S>
bool IsEqual(T v1, S v2) {
return v1 == v2;
}
// ... main
int c = 4;
double d = 4.0;
printf("%s", IsEqual(c,d) == true ? "True" : "False"); // Prints true

或者通过将T指定为double来帮助编译器选择正确的重载。

IsEqual<double>(c,d);

显式模板实例化保证编译器为一组特定的模板参数生成代码,这意味着如果链接器需要它,就会找到它。

它不会隐藏模板参数的其他组合,也不会阻止它们被实例化(隐式或其他方式(。

因此,显式实例化对模板参数推导没有影响,对重载解析也没有影响。 整个可能的实例化家族仍然是候选者。