为什么这个模板函数不会编译C ++

时间:2016-02-15 22:57:42

标签: c++ function templates

我在网上看到了这段代码:

template <class T, class S>
    T f(T& a, T& b, S c) {
    T t1, t2, t3;
    if (a==b) return t1;
    if (c>0) return t2;
    return t3;
} 

接下来是这些电话:

f('c', 5, 5); // why this doesn't compile?

f(3, 4, 6.0);  // why does this compile?

第一个没有编译,而第二个没有..为什么?

1 个答案:

答案 0 :(得分:4)

在C ++中(与C相反)'c'char

您的代码无法编译,因为参数T的模板参数推断失败 - 它是不明确的。在f('c', 5, 5)调用中,第一个函数参数表示它应该是char,第二个函数参数应该是int。您是如何期望编译器解决这种歧义的呢?

如果你想要T == int,你可以明确指定第一个模板参数

f<int>('c', 5, 5);

或者您可以使用显式转换

f((int) 'c', 5, 5);

当然,正如已经注意到的那样,即使您完成了模板参数推导问题,您仍然无法使用rvalues初始化非常量左值引用。由于后一种原因,你的两个电话也都是无效的。