为什么这段代码会出错:
template <typename T>
class CLs{
public:
void print(T* p){ p->print(); }
};
void main() {
CLs<int> c1; // compilation OK
CLs<double> c2; // compilation OK
double d=3;
c2.print(&d);
}
我的讲师说 c2.print(&d);
行有一个错误:
编译错误:成员函数仅在调用时实例化。
他是什么意思?
最佳答案
类模板的成员函数只有在被使用时才会真正生成。这是模板的重要组成部分,它可以防止不必要的代码膨胀,并允许支持不满足模板的整个隐式契约(Contract)但足以使用的类型。
您对 CLs<T>
的声明变量编译干净,因为 print
函数在使用之前不会被编译。 c2.print(&d)
编译失败,因为它会导致 CLs<double>::print
的实例化, 这是病式的。
关于c++ - 模板成员函数仅在调用时实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31157196/