C ++部分模板专业化&多个符号定义错误

时间:2012-10-16 20:01:42

标签: c++ templates

我一直试图以多种方式分析这个问题,但我无法弄明白。

我的用例是 - 我有一个模板类,我想为特定类型提供特定的实现,同时保留其余的通用实现。

以下是代码:

template< typename T >
struct SomeClass
{
    void foo();
};

template< typename T >
void SomeClass< T >::foo()
{
    printf( "generic impl." );
}

template<>
void SomeClass< char >::foo()
{
    printf( "char-specific impl." );
}

一切正常,只要整个代码位于使用它的代码旁边的CPP文件中。

只要我将代码移动到专用文件,就像这样:

SomeClass.h

#ifdef _SOME_CLASS_H

template< typename T >
struct SomeClass
{
    void foo();
};

template< typename T >
void SomeClass< T >::foo()
{
    printf( "generic impl." );
}

#endif 

SomeClass.cpp

#include "SomeClass.h"

template<>
void SomeClass< char >::foo()
{
    printf( "char-specific impl." );
}

我收到一个链接器错误,声称void SomeClass&lt; char&gt; :: foo()已经实现。

任何想法为什么?

2 个答案:

答案 0 :(得分:2)

将特殊功能成员的前向声明添加到标题中:

template<> void SomeClass<char>::foo();

答案 1 :(得分:1)

为了声明专用模板类的成员函数,您需要首先定义专用类:

template <>
struct SomeClass<char>
{
  void foo ();
};

只有这样你才能定义实际的功能实现:

template <>
void SomeClass<char>::foo () { /* do something */ }