模板成员函数仅在调用时实例化

template member function is instantiated only if called

为什么这段代码有错误:

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.

他是什么意思?

class 模板的成员函数仅在使用时才真正生成。这是模板的一个重要部分,它可以防止不必要的代码膨胀,并允许支持不满足模板的整个隐式合同但足以使用的类型。

您对 CLs<T> 变量的声明编译干净,因为 print 函数在使用之前不会编译。 c2.print(&d) 编译失败,因为它导致 CLs<double>::print 的实例化是错误的。