我是c ++模板的新手。如果我定义了一个模板方法,我发现我可以调用非模板方法
例如
void non_template(double x)
{
}
template<typename T>
void testClass<T>::method1() {
/*****/
T var1;
//call a nontemplate here using var1
non_template(var1);
}
我不确定为什么在没有任何编译错误的情况下允许这样做;如果我的var1是int,那会错吗?
答案 0 :(得分:1)
编译器通过将允许的转换应用于参数来查找匹配项以查找匹配项(即可以调用的函数)。所有功能都是如此,而不仅仅是模板。
如果T是一个可以隐式转换为double的类型,那么可以调用“非模板”函数。
如果T不能隐式转换为double,那么编译器会报告它无法以某种方式找到匹配。
答案 1 :(得分:1)
我不确定为什么在没有任何编译错误的情况下允许这样做;如果我的var1是int,那会错吗?
模板类和函数与非模板化类和函数的工作方式略有不同:检查有效性是在2次传递中完成的 - 一次是在定义时,另一次是在实例化时(首次调用方法时)。
处理模板函数时,它会检查语法等类型,并且类型不依赖于模板参数。如果这些成功,它将不会抱怨并将模板的定义存储在其状态中。
当您尝试使用一组特定参数调用(实例化)模板时,它将返回到存储的定义并重新检查依赖于传入的参数类型的内容。
所以,如果我尝试使用int,double和float来调用你的函数,如:
test_calls.method(5.0); // Works as expected
test_calls.method(5); // Works, because int can be converted to double implicitly.
test_calls.method("Hello"); // Doesn't work, because "non-templated" cannot be call with a char const* argument.