我在网上看到这段代码:
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?
第一个无法编译,而第二个可以.. 为什么?
最佳答案
在 C++(相对于 C)中,'c'
是一个 char
。
您的代码无法编译,因为参数 T
的模板参数推导失败 - 它不明确。在 f('c', 5, 5)
中调用第一个函数参数说它应该是 char
,第二个说它应该是 int
.您期望编译器如何解决这种歧义?
如果你想要 T == int
你可以显式指定第一个模板参数
f<int>('c', 5, 5);
或者你可以使用显式转换
f((int) 'c', 5, 5);
当然,如前所述,即使您解决了模板参数推导问题,您仍然无法使用右值初始化非常量左值引用。由于后一个原因,您的两个调用也无效。
关于c++ - 为什么这个模板函数不能编译 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35420661/