重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

C++模板的特例化编译为多重定义问题-创新互联

之前遇到了一些关于模板特例化的问题,自己总结一下。

五峰ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!

    模板的特例化是C++新标准的一个特点,可以自定义某些模板的实现,比如在比较函数compare可以使用less标准库模板比较string、int、char、指针等类型,但如果有const char*类型且比较字符串的字典大小时,就与之前的比较方式不同了:

#ifndef A_H
#define A_H

#include 
#include 
using std::less;
template 
int compare(const T v1,const T v2) 
{
    
    if (less()(v1,v2)) 
    {
        return -1;
    }
    else if (less()(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"

    这里只有一句,但包含了a.h文件表示将其模板函数的定义包含,且特例化的函数类似一个普通函数,则a.cpp、main.cpp包含多个相同函数的定义,因此在链接时有重定义问题。

    解决方法:

    使用内联inline声明特例化的模板,则某些函数的定义可以在多个文件包含(一些函数的实现可能不支持内联):

template <>
inline int compare(const char *a,const char *b) 
{
    return strcmp(a,b);
}

    另外一个是使用一个文件包含该头文件,让所有链接的文件只有一个特例化定义

    第三个是定义普通同名函数,通过重载调用非模板函数(在参数匹配级别相同时,非模板重载函数优先调用)

// a.h
#ifndef A_H
#define A_H

#include 
#include 
using std::less;
template 
int compare(const T v1,const T v2)
{

    if (less()(v1,v2))
    {
        return -1;
    }
    else if (less()(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*"<

    如果有其他的方法请大家一起交流

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前文章:C++模板的特例化编译为多重定义问题-创新互联
URL地址:http://cqcxhl.cn/article/ccpicc.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP