我想知道为什么模板方法可以调用非模板方法? 我是C++模板的新手。如果我定义了一个模板方法,我发现我可以调用非模板方法

我想知道为什么模板方法可以调用非模板方法? 我是C++模板的新手。如果我定义了一个模板方法,我发现我可以调用非模板方法,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); } void非_模板(双x) { } 模板 void testClass::method1(){ /*****/ T-var1

比如说

void non_template(double x)
{
}

template<typename T>
void testClass<T>::method1() {
   /*****/
   T var1;
   //call a nontemplate here using var1
   non_template(var1);
}
void非_模板(双x)
{
}
模板
void testClass::method1(){
/*****/
T-var1;
//使用var1在此处调用非模板
非_模板(var1);
}

我不知道为什么在没有任何编译错误的情况下允许这样做;如果我的var1是int,它会错吗

编译器通过对参数应用允许的转换来查找匹配项,以便找到匹配项(即可以调用的函数)。这适用于所有函数,而不仅仅是模板

如果T是一个可以隐式转换为double的类型,那么就可以调用“non-template”函数

如果T不能隐式转换为double,那么编译器将报告它无法以某种方式找到匹配项

我不知道为什么在没有任何编译错误的情况下允许这样做;如果我的var1是int,它会错吗

模板类和函数的工作方式与非模板类和函数略有不同:检查有效性分两次进行——一次在定义时进行,另一次在实例化时(第一次调用方法时)进行

在处理模板函数时,它会检查语法和类型等不依赖于模板参数的内容。如果这些操作成功,它将不会抱怨并将模板的定义存储在其状态中

当您尝试使用一组特定的参数调用(实例化)模板时,它将返回到存储的定义,并重新检查依赖于传入的参数类型的内容

如果我尝试用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.

如果使用不能转换为双精度的typpe
T
实例化模板,则会出现编译错误。请将模板想象为美化的宏。如果在替换T之后可以编译代码,那么就可以了。