模板类,模板类函数特例化,模板类特例化

今天在看某c++框架源码时,发现模板类里的部分函数可以特例化,感觉很神奇便尝试了下,发现很多平时不会注意的c++细节及知识,写下来分享给大家,以便大家遇到相似问题时可以少踩点坑。

  1. 模板类会出现链接问题,编译不通过
    如果模板类.h文件和.cpp文件分开存放,然后编译的时候会提示链接错误,无法生产exe文件,具体的原因可以参看编译原理。
    决解办法:1 .h文件和.cpp文件合成一个文件
    2 在使用该类模板处包含.cpp文件即可.

  2. 模板类部分函数特例化

template<typename T> class test
{
public:
    test(){};
    ~test(){};
    void gohome();
    void gogo();
};
template<typename T> void test::gogo(){
    cout << "gogo" << endl;
}
template<> void test<int>::gohome(){
    cout << "int" << endl;
}


template<> void test<double>::gohome(){
    cout << "double" << endl;
}

这个时候编译会出现错误错误 3 error LNK1169: 找到一个或多个多重定义的符号
如果把包含的.cpp文件删除后又会提示链接错误,是个两难的问题。
解决办法:

template<typename T> void test::gogo(){
    cout << "gogo" << endl;
}
template<> void test<int>::gohome(){
    cout << "int" << endl;
}


template<> void test<double>::gohome(){
    cout << "double" << endl;
}
//
template class test<double>;
template class test<int>;

特例化需要使用这个模板类会实例化的所有实例,然后就可通过编译,并且成功运行。
这样做的好处是:只允许用户实例化部分,而并非可以实例化任何实例化,从而约束用户行为。

你可能感兴趣的:(c++)