示例:假设f
是模板函数,有两个参数:
f (1, 2)
在此调用中,模板函数是否假定其参数为int
或short
或其他任何内容?
编辑1:
模板函数声明:
template <typename dataTypeA, typename dataTypeB> dataTypeB functionX (dataTypeA argA, dataTypeB argB)
答案 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
更新:根据您的编辑,请注意,由于您只为每个模板参数匹配一个参数,因此模糊匹配不会有任何问题。