1

現在、この問題をいくつかの方法で分析しようとしていますが、わかりません。

私のユースケースは - テンプレートクラスがあり、特定の型に特定の実装を提供し、残りの一般的な実装を維持したいと考えています。

コードは次のとおりです。

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< char >::foo() が既に実装されているというリンカ エラーが表示されます。

理由はありますか?

4

2 に答える 2

2

特殊な関数メンバーの前方宣言をヘッダーに追加します。

template<> void SomeClass<char>::foo();
于 2012-10-16T21:36:26.003 に答える
1

特殊化されたテンプレート クラスのメンバー関数を宣言するには、まず特殊化されたクラスを定義する必要があります。

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

そうして初めて、実際の関数の実装も定義できます。

template <>
void SomeClass<char>::foo () { /* do something */ }
于 2012-10-16T20:05:26.593 に答える