zoukankan      html  css  js  c++  java
  • 微软定义函数模板特化编译时的重定义错误

    新手发帖,很多方面都是刚入门,有误错的地方请大家见谅,欢迎批评指正

    Issue:
    在函数模板特化的过程当中, 编译时到遇多重定义的误错; (VC2010和g++)

    以下是一个特化的例子:

    template <class T>
    T maxA( T t1, T t2 ) {
        return (t1 > t2 ? t1 : t2);
    }
    //特化 specialize
    typedef const char *PCC;
    template<> PCC maxA< PCC >( PCC s1, PCC s2 ) {
        return ( strcmp( s1, s2 ) > 0 ? s1 : s2 );
    }

    1)如果这段代码是添加在main.cpp里头, 没有问题, 编译通过;

    2)如果这段代码添加到头文件, e.g. test.h中, 辑编阶段就会有多重定义的error;


    Solution:

    a) 将函数模板的特化声明在头文件中,定义放在cpp中;

    //header-test.h
    template <class T>
    T maxA( T t1, T t2 ) {
        cout<<"Base"<<endl;
        return (t1 > t2 ? t1 : t2);
    }
    //特化 specialize
    typedef const char *PCC;
    template<> PCC maxA< PCC >( PCC s1, PCC s2 ) ;
    //implement
    //test.cpp
    template<> PCC maxA< PCC >( PCC s1, PCC s2 ) {
        cout<<"Spec"<<endl;
        return ( strcmp( s1, s2 ) > 0 ? s1 : s2 );
    }

    b) 把特化的函数声明为inline;

    template <class T>
    T maxA( T t1, T t2 ) {
        cout<<"Base"<<endl;
        return (t1 > t2 ? t1 : t2);
    }
    //特化 specialize
    typedef const char *PCC;
    template<>
    inline PCC maxA< PCC >( PCC s1, PCC s2 ){
        cout<<"Spec"<<endl;
        return ( strcmp( s1, s2 ) > 0 ? s1 : s2 );
    }


    Reason: 
    The full specialization is no longer a template. It's a concrete function.
    函数模板全特化后不再是一个模板, 它成为了一个函数的现实;
    如果在头文件中全特化函数模板, 就好象在头文件中多次定义了同一个函数, 编译器就抓狂了.


    <refer to> http://stackoverflow.com/questions/4446968/template-specialization-multiply-defined-symbols

        每日一道理
    微笑,是春天里的一丝新绿,是秋日里的一缕阳光,是骄阳下的一片浓荫,是冬雪中的一株梅红……微笑着去面对吧,你会感到人生是那样的温馨与甜蜜!

    用户论评

    暂无论评。
    表发论评:

    文章结束给大家分享下程序员的一些笑话语录: PC软件体积大,是因为一个PC软件功能往往较多,能够满足你一个方面的需求,而一个iphone软件往往没几行代码,干一件很小的事情,自然需要的软件就多。就像吃西瓜和吃瓜子的来比数目,单位不同啊。

  • 相关阅读:
    错误:/usr/lib/python2.4/sitepackages/_sqlitecache.so: wrong ELF class: ELFCLASS32
    Ubuntu 12.04LTS g++编译错误解决
    yum Error: Cannot retrieve repository metadata (repomd.xml) for repository: xxxxx
    win7中制作ubuntu 1210启动盘
    Java 访问 Hbase 的API
    光标所能实现的不同形状
    Asp遍历服务器对象的代码
    一些好的网站
    通用高效分页存储过程代码
    一些模拟windows 界面的 js
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3050713.html
Copyright © 2011-2022 走看看