我想知道为什么模板方法可以调用非模板方法?

时间:2015-01-31 10:59:32

标签: c++

我是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,那会错吗?

2 个答案:

答案 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.