我一直试图以多种方式分析这个问题,但我无法弄明白。
我的用例是 - 我有一个模板类,我想为特定类型提供特定的实现,同时保留其余的通用实现。
以下是代码:
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()已经实现。
任何想法为什么?
答案 0 :(得分:2)
将特殊功能成员的前向声明添加到标题中:
template<> void SomeClass<char>::foo();
答案 1 :(得分:1)
为了声明专用模板类的成员函数,您需要首先定义专用类:
template <>
struct SomeClass<char>
{
void foo ();
};
只有这样你才能定义实际的功能实现:
template <>
void SomeClass<char>::foo () { /* do something */ }