我不清楚编译器何时以及如何创建template
函数。所以我无法解释以下两个例子的行为。
示例1.
struct C1 {
template <typename T>
void g(T t);
};
template<>
void C1::g(double x) {
cout << "Member templates. C1::g(double) " << x << endl;
}
以上代码构建并运行。但是,如果没有template<>
,g ++就会抱怨。
error: prototype for ‘void C1::g(double)’ does not match any in class ‘C1’
但如果我将g(double)的定义放在类中,那就没关系。
问题1: 为什么必须使用模板&lt;&gt;来专门设置成员模板方法?课外?
示例2。
struct C1 {
template <typename T>
void g(T t);
void g(double x) {
cout << "C1::g(double): " << x << endl;
}
};
template<>
void C1::g(double x) {
cout << "Member templates. C1::g(double) " << x << endl;
}
C1 c;
c.g(10.5); // output: C1::g(double): 10.5
不调用成员模板模板void g()。这让我想知道
问题2。会员模板是否专业化?
答案 0 :(得分:1)
不调用成员模板模板void g()。这让我想知道
这里的函数重载问题,非模板函数将在重载分辨率上赢得模板专业化。
http://en.cppreference.com/w/cpp/language/overload_resolution
最佳可行功能
对于每对可行函数F1和F2,从第i个参数到第i个参数的隐式转换序列被排序以确定哪一个更好(除了第一个参数,静态成员函数的隐式对象参数)对排名没有影响)
如果F1的所有参数的隐式转换都不比F2的所有参数的隐式转换差,则确定F1是比F2更好的函数,并且
1)至少有一个F1参数,其隐式转换优于F2参数的相应隐式转换
2)或。如果不是这样,(仅在通过转换进行非类初始化的上下文中),从返回类型F1到正在初始化的类型的标准转换序列优于来自返回类型F2的标准转换序列
3)或者,如果不是这样,F1是非模板函数,而F2是模板特化
4)或者,如果不是这样,F1和F2都是模板特化,F1根据模板特化的部分排序规则更加专业化
您可以明确调用模板特化功能:
c.g<>(10.5); // output: Member templates. C1::g(double) 10.5