类模板函数使用时实例化说明

来源:互联网 发布:安卓的内存优化 编辑:程序博客网 时间:2024/06/06 17:47

这个规则的一个有意思的结果就是:如果传递的类型仅使唤部分类成员函数合法,只要调用不到,不影响类模板使用。

以下代码是个展示例子

template<typename _T>class Tpl{public:    void fun1(_T o)    {        char data[o];        cout << sizeof(data) << endl;    }    void fun2(_T o)    {        cout << o.size() << endl;    }};int main(int argc, char* argv[]){    Tpl<int> t1;    t1.fun1(3);    //t1.fun2(3);           //非法,但不影响模板实例化    Tpl<string> t2;    //t2.fun1("abcdefg");   //非法,但不影响模板实例化    t2.fun2("abcdefg");    return 0;}


如果这个效果不是自己所希望的,则可以显示实例化,显示实例化会实例化所有成员,检查非法

template class Tpl<int>;template class Tpl<string>;

源文件是独立编译的,每一次实例化都可能产生重复的实例类,这可能是难以接受的,解决办法是声明为外部定义,这样遇到模板使用时,不会实例化,而是链接外部,确保存在一次定义,否则会报链接错误

extern template class Tpl<int>;extern template class Tpl<string>;


原创粉丝点击