为什么此代码中存在错误:
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);
行有一个错误:
Compilation Error: Member function is instantiated only if called.
他是什么意思?
答案 0 :(得分:2)
类模板的成员函数只有在使用它们时才会生成。这是模板的一个重要部分,可以防止不必要的代码膨胀,并允许支持不能完成模板的整个隐式契约的类型,但足以使用。
CLs<T>
变量的声明编译干净,因为print
函数在编译之前不会被编译。 c2.print(&d)
无法编译,因为它导致CLs<double>::print
的实例化,这是不正确的。