特化与multiple definition及

程序员已经习惯于将模板类的实现放到头文件里,但是有一些特化类或特化成员函数的实现如果也随手放到头文件里,则很可能产生multiple definition的错误。
如下所示:
-----------------------------------------
//a.h

#ifndef MYA
#define MYA

template <typename T>
class AA
{
public:
    T v;

    void DoSomething();
} ;

template <typename T>
void AA<T>::DoSomething()
{
    printf("general do something\n");
}

template <>
void AA<int>::DoSomething()
{
    printf("special int do something\n");
}
#endif

----------------------------------------
//b1.h
#ifndef MYB1
#define MYB1
void B1ReferA();
#endif
------------------------------------------
//b1.cpp
#include "b1.h"
#include "a.h"
void B1ReferA()
{
    AA<int> myaa;
    myaa.DoSomething();
}
------------------------------------------
//b2.h
#ifndef MYB2
#define MYB2
void B2ReferA();
#endif
--------------------------------------------
//b2.cpp
#include "b2.h"
#include "a.h"
void B2ReferA()
{
    AA<int> myaa;
    myaa.v = 100;
    myaa.DoSomething();
}
--------------------------------------------
//main.cpp
#include "b1.h"
#include "b2.h"
int main(int argc, char* argv[])
{
    B1ReferA();
    B2ReferA();
    printf("hello world\n");
    int n;
    scanf("%d",&n);
    return 0;
}

上面的文件编译完了之后,会在b1.o和b2.o中都生成AA<int>::DoSomething的代码段,从而产生重复定义的错误。

解决方案是:
第一种:改为
template <> inline
void AA<int>::DoSomething()
{
    printf("special int do something\n");
}
第二种:改为
template <>
void AA<int>::DoSomething();
并且添加a.cpp去实现该函数:
//a.cpp
#include "a.h"
template <>
void AA<int>::DoSomething()
{
    printf("special int do something\n");
}

你可能感兴趣的:(template)