之前遇到了一些关于模板特例化的问题,自己总结一下。
模板的特例化是C++新标准的一个特点,可以自定义某些模板的实现,比如在比较函数compare可以使用less<T>标准库模板比较string、int、char、指针等类型,但如果有const char*类型且比较字符串的字典大小时,就与之前的比较方式不同了:
#ifndef A_H
#define A_H
#include <iostream>
#include <cstring>
using std::less;
template <typename T>
int compare(const T v1,const T v2)
{
if (less<T>()(v1,v2))
{
return -1;
}
else if (less<T>()(v2,v1))
{
return 1;
}
else
{
return 0;
}
}
template <>
inline int compare(const char *const a,const char *const b)
{
return strcmp(a,b);
}
#endif
#include "a.h"
using std::cout;
using std::endl;
int main()
{
cout << compare(1,2) << endl;
cout << compare("123","asd") << endl;
return 0;
}
现在看上去没什么问题,并且只有这两个文件编译通过且正常运行,如果多了一个包含a.h的文件a.cpp:
#include "a.h"
解决方法:
template <>
inline int compare(const char *a,const char *b)
{
return strcmp(a,b);
}
另外一个是使用一个文件包含该头文件,让所有链接的文件只有一个特例化定义
第三个是定义普通同名函数,通过重载调用非模板函数(在参数匹配级别相同时,非模板重载函数优先调用)
// a.h
#ifndef A_H
#define A_H
#include <iostream>
#include <cstring>
using std::less;
template <typename T>
int compare(const T v1,const T v2)
{
if (less<T>()(v1,v2))
{
return -1;
}
else if (less<T>()(v2,v1))
{
return 1;
}
else
{
return 0;
}
}
int compare(const char *a,const char *b) ;
// a.cpp
#include "a.h"
int compare(const char *a, const char *b)
{
std::cout << "const char*"<<std::endl;
return strcmp(a,b);
}
// main.cpp 相同
如果有其他的方法请大家一起交流
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。