2011-12-29 7 views
5

()テンプレートの特殊化は、テンプレートは次のようになります。オペレータ私はテンプレートオペレータに特化をやろうとしている

template <typename Iterator1, typename Iterator2> 
ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType worst_dist = -1) const 

私はこのようになります専門やった後:

template <> 
float operator()<float*,float*>(float* a, float const* b, unsigned long size, float worst_dist = -1) const 

をIコンパイル時にエラーが発生する

クラススコープ内で 'operator()'関数を特殊化できない

すべてのこれらの機能は、私はいくつかの助けを得るために喜んでいるよ構造体テンプレート

です。ありがとう。

+0

「仕様」と言うときは、「専門性」ですか? –

+0

[このSOの質問/回答] [1]があなたがしようとしていることに答えるかもしれないと思います。 [1]:http://stackoverflow.com/questions/4920068/partially-specializing-member-function-implementations – wilx

+0

'ResultType'は何ですか?あなたのテンプレートのパラメータの1つになっていますか? –

答えて

7

なぜこの演算子を特殊化したいのですか?とにかく特殊化に依存する構文を使用して呼び出すことはできません(つまり、テンプレート引数を明示的に指定すること)!オーバーロードを使用するだけで大​​丈夫です。テンプレート引数を明示的に指定する場合は表記法を使用することが望ましく、必要な場合もありますが、一般に関数がオーバーロードではなく特殊化を使用することは重要ではありません。

私は標準で物事を読むだけで、実際には明示的な特殊化を行うことはできますが、それはクラス定義の外になければなりません。例:

#include <iostream> 

struct foo 
{ 
    template <typename T> void operator()(T const&) { 
     std::cout << "general\n"; 
    } 
}; 

template <> 
void foo::operator()<int>(int const&) { 
    std::cout << "int spec\n"; 
} 

int main() 
{ 
    foo f; 
    f(1.2); 
    f(1); 
    f<double>(1); // <-- ERROR: doesn't work! 
} 

これはオーバーロードを使用しても同じように機能します。ただし、明示的に指定されたテンプレート引数を使用してもまだ動作しません。

+1

+1は、特殊化よりも関数オーバーロードです。 – AJG85

+0

私は答えをありがとう –

関連する問題