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

时间:2015-07-01 09:13:34

标签: c++ templates member-functions

为什么此代码中存在错误:

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.

他是什么意思?

1 个答案:

答案 0 :(得分:2)

类模板的成员函数只有在使用它们时才会生成。这是模板的一个重要部分,可以防止不必要的代码膨胀,并允许支持不能完成模板的整个隐式契约的类型,但足以使用。

CLs<T>变量的声明编译干净,因为print函数在编译之前不会被编译。 c2.print(&d)无法编译,因为它导致CLs<double>::print的实例化,这是不正确的。