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

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;
}

最佳答案

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

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

这样,显式实例化对模板参数的推导不起作用,对过载解析也不起作用。可能实例化的整个家族仍然是候选对象。

关于c++ - 为什么显式模板实例化不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45887578/

10-13 07:45