C++函数模板使用中的注意事项

来源:互联网 发布:拉里·伯德数据 编辑:程序博客网 时间:2024/05/18 00:21

举个例子:

template <typename elemType>void display_message(const string &msg,const vector<elemType> &vec){    cout<<msg;    for (int ix=0;ix<vec.size();++ix)    {        elemType t=vec[ix];        cout<<t<<' ';    }    cout<<endl;}

这是一个简单的函数模板的定义,但是如果把定义放在头文件中,函数体放在.CPP中会出现什么问题呢?

main.obj : error LNK2001: unresolved external symbol "void __cdecl display_message(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::vector<int,class std::allocator<int> > const &)" (?display_message@@YAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV?$vector@HV?$allocator@H@std@@@2@@Z)

好尴尬,你只能看出这是link的错误,但是如果你只这一个错误的话,或许没问题,但是如果你对这个函数同时重载的话,也许你就不觉得这个问题那简单了

template <typename elemType>void display_message(const string &msg,const vector<elemType> &vec){    cout<<msg;    for (int ix=0;ix<vec.size();++ix)    {        elemType t=vec[ix];        cout<<t<<' ';    }    cout<<endl;}void display_message(const string &msg, int size){    cerr<<msg<<size<<"\n";}

这样的重载从语法上来说是完全没有问题的,然而,正确的做法是,将这两个函数体,同时放在.h文件中,或者,模板函数放在.h文件中,普通的重载函数体,放在.cpp源文件中,这样就没有任何问题了。

0 0
原创粉丝点击