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

标签 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?

第一个无法编译,而第二个可以.. 为什么?

最佳答案

在 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/

相关文章:

c++ - CPLEX - 降低成本

c++ - 我不理解 std::result_of 和 decltype 的这些用法

c++ - 使用抽象类的容器来容纳子类

c++ - int&a 和 int &a 有区别吗?

r - 在 R 中编写一个函数,根据字母的第一个实例选择字符串并替换该字符串

python - 如何在 Python 中对函数进行深层复制?

javascript 将循环数组的函数传递给使用 switch 语句日期方法的函数

wpf - 在哪里可以找到免费的 WPF 控件和控件模板?

C++ 将索引绑定(bind)到一个数据结构

javascript - 转义 Dust.js 标签