2017-02-03 16 views
1

の明示的な特殊化は、我々は次のクラステンプレートがあるとします。クラステンプレートや機能

template<typename T, size_t m, size_t n> 
    class Matrix { 
    /* Implementation/Declaration is probably irrelevant and has been omitted. */ 
    }; 

私はテンプレートクラスのための特定の機能を特化したいです。

template<> template<typename T, size_t m, size_t n> 
inline std::wstring Microsoft::VisualStudio:CppUnitTestFramework::ToString(const Matrix<T, m, n> &mtrx) { 
    /* Definition omitted */ 
} 

(そして、はい、私は専門てる機能を見つけるのはそれほど難しいことではありません実際の関数である。)

私は上記のコードはまだ、間違っている理由として理由を見ませんコンパイルするとき(あなたが尋ねる前に、適切なファイルが含まれている、)私は、次の(非常に助けにならない)エラーメッセージが表示されます。

C2244: 'ToString': unable to match function definition to an existing declaration 

人々は必然的にそれを聞いてきますので、私は同様の機能のためのプロトタイプが含まれる場合があります私は'm specializing:

template <typename Q> static std::wstring ToString (const Q& q); 

そして、私はテンプレート引数のないクラス(例:std :: string)に特化しても問題ありません。

+0

'テンプレート<>'部分を取り除く。 –

+0

私はすでにそれを試みました。うまく行かなかった。 (まったく同じエラーメッセージです。) – Isaiah

+0

名前空間内で最初に宣言しましたか? –

答えて

1

特殊化したくない - 機能テンプレートの部分的な特殊化などはありません。代わりに、過負荷が必要です。また、名前空間の外部でオーバーロードを定義することはできません。名前空間を再度開く必要があります。このようなもの:

namespace Microsoft { 
namespace VisualStudio { 
namespace CppUnitTestFramework { 

template<typename T, size_t m, size_t n> 
std::wstring ToString(const Matrix<T, m, n> &mtrx) { 
    /* Definition omitted */ 
} 

}}} // end namespaces 
関連する問題