我对下面的模板行为感到困惑,它使用空尖括号(没有参数的模板)编译很好,因为从语法上讲,模板<>被保留以标记显式模板特化.
templatevoid add(T a, T b) { } int main() { add<>(10, 3); // compiles fine since both parameters are of same data type add<>(10, 3.2); // Error: no matching function for call to add(int, double) }
在上面的例子中模板参数真的是可选的吗?
template<>
保留用于标记显式模板特化.
它意味着各种各样的东西,取决于背景.这意味着"使用默认或推断的参数",就像你简单地说的那样add
.
在第一种情况下,两个函数参数具有相同的类型,因此模板参数可以推导为int
.
在第二种情况下,它们具有不同的类型,因此无法推导出模板参数.您必须指定所需内容,例如add<double>
,转换一个函数参数以匹配另一个函数参数,或修改模板以分别对每个类型进行参数化.
在上面的例子中模板参数真的是可选的吗?
是的,如果它可以从参数类型中推断出来.
在第一种情况下,是的,因为可以通过标准规则推断出来.在第二个,不,因为他们不能 - 你必须写如下:
add<float>(10, 3.2);