模板函数的默认类型假设

时间:2011-08-25 10:30:50

标签: c++ templates

示例:假设f是模板函数,有两个参数:

f (1, 2)在此调用中,模板函数是否假定其参数为intshort或其他任何内容?

编辑1:

模板函数声明:

template <typename dataTypeA, typename dataTypeB> dataTypeB functionX (dataTypeA argA, dataTypeB argB)

2 个答案:

答案 0 :(得分:7)

模板不假设任何东西。文字的类型为int,这将是编译器推导出的类型。

答案 1 :(得分:3)

正如@David已经说过,就你的问题而言,没有“做出假设”这样的事情。 literals只有类型,这是函数模板可用于类型推导的类型。请记住,转换被视为模板匹配的一部分,但是!

所以,假设你有这个功能模板:

template <typename T> void foo(T x, T y);

然后,如果您拨打foo(1, 2),则会使用T = int调用此信息。

如果您说foo(1u, 2u),则扣除额为T = unsigned int

如果您说foo(1u, 2)之类的混合内容,则没有首选匹配项,编译器会报告错误。

由于C或C ++中没有short字面值,如果要显式调用函数foo<short>,您可以这样说,或创建临时显式short参数:< / p>

foo<short int>(3, 4);
foo<short int>(3u, 4l);  // also OK because of conversion
foo(short(3), short(4)); // deduction

更新:根据您的编辑,请注意,由于您只为每个模板参数匹配一个参数,因此模糊匹配不会有任何问题。