2015-07-01 142 views
2

为什么在这个代码中的错误:模板成员函数只实例化

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.

是什么他的意思是?

+2

变量'd'是'double'类型的,所以当你在函数体中调用'c2.print(&d)'就像调用'd.print()',但d是一个具体类型,并且不会'没有成员函数'print'。 – 101010

回答

1

类模板的成员函数实际上仅在使用它们时才会生成。这是模板的一个重要组成部分,它可以防止不必要的代码膨胀,并支持不满足模板的整个隐式约定但足够使用的类型。

您的CLs<T>变量声明编译干净,因为print函数直到使用它才编译。 c2.print(&d)无法编译,因为它导致CLs<double>::print的实例化,这是不合格的。