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

阿米尔汗

我在互联网上看到了以下代码:

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

当然,正如已经指出的那样,即使您解决了模板参数推导问题,您仍将无法使用rvalues初始化非恒定的左值引用。由于后一个原因,您的两个电话也都无效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么这个模板化函数不能对数组进行零初始化编译?

为什么这个模板函数不能识别 lamda 的返回类型?

为什么模板类允许不能编译的成员函数?

为什么这个Objective-C ++程序不能编译?

为什么这个C ++程序可以在MacOS上编译而不能在Ubuntu上编译?

模板函数为什么不能添加“cin”?

为什么不能内联我的模板函数

如果无法在MSVC上编译,为什么使用C ++ 17`constexpr这个模板化结构?

为什么这个基于通用协议的框架不能编译?

为什么这个自定义类型特征不能编译

为什么我不能编译这个简单的线程测试?

为什么不能编译此功能模板专业化?

为什么我不能用 lambda 替换这个函数

为什么我不能消除这个箭头函数?

为什么我不能在 React 中调用这个函数?

为什么这个 UrlFetch 函数不能正常工作?

为什么这个简单的Java泛型函数无法编译?

在C ++中,为什么模板函数不能具有部分专业化?

在Itanium C ++ ABI中,为什么模板函数的错误名称不能解析依赖的typedef?

为什么不能在C ++模板中部分地专门化成员函数

为什么`++ a ++`不能在C ++中编译而`(++ a)++`可以编译?

为什么编译器不能匹配此函数类型?

为什么模板函数不能成为模板类的好友模板函数?

为什么以下模板化的类成员函数无法编译?

为什么这个交换程序不能在 C 中运行?

为什么这个 C++ 循环不能无限运行?

为什么这个C程序不能让我访问内存?

为什么这个公式不能在 C++ 中计算?

C ++:为什么这个constexpr不是编译时间常数