2012-02-17 13 views
2

C++では、テンプレート化されたオブジェクトのテンプレート化された関数を特殊化しようとしています。ここでテンプレート化されたクラスのためのテンプレート化された関数の特殊化

は、基本的な例である: TEST.H:

In file included from test.cpp:1:0: 
test.h:13:25: error: too many template parameter lists in declaration of ‘void f(myC<T>)’ 
test.h:13:6: error: template-id ‘f<myC<T> >’ for ‘void f(myC<T>)’ does not match any template declaration 
test.h:13:25: note: saw 2 ‘template<>’, need 1 for specializing a member function template 

template <class T> 
class myC { 
    T x; 
}; 

template <class U> 
void f(U y) { 
} 

template <> 
template <class T> 
void f<myC<T> >(myC<T> y) { 
} 

TEST.CPP

#include "test.h" 
int main() { 
    myC<double> m; 
    f(m); 
} 

GCC 4.6.1は私に次のエラーメッセージが表示されますこれはすべての可能でますか?あるいは、同じ目標を達成する別の方法がありますか?

答えて

2

あなたはテンプレート関数を特化することはできません。テンプレートクラスのみを特殊化することができます。 編集:Nawazの答えは正しいです:それは、クラスのためにのみ、テンプレート関数には許可されていない部分的な特殊化です。完全な分業が可能です:

template <class U> void f(U y) {} 
template<> void f<double>(double y) {} // specialization for double 

注それは文脈から推測することができる場合は、テンプレート引数を明示的に指定する必要がないこと:お使いの場合には

template<> void f<>(int y) {} // specialization for int 

、完全な分業があるため不可能です関数の引数には、テンプレートクラスです。しかし、テンプレート関数は、どのような関数と同様に、オーバーロードすることができます。あなたの場合は、次のようになります:

template <class T> 
class myC { 
    T x; 
}; 

template <class U> 
void f(U y) { 
} 

template <class T> 
void f(myC<T> y) { 
} 

int main() { 
    myC<double> m; 
    f(m); 
    return 0; 
} 
0

私が知る限り、テンプレート関数(テンプレートクラス(または構造体)のみ)を特殊化することはできません。

しかし、それはほとんど制限はありません。ただ、静的パブリックメンバ関数で構造体を宣言し、構造体にテンプレートパラメータをMAVE:

template <class T> 
class myC { 
    T x; 
}; 

template <class U> 
struct Foo 
{ 
    static void f(U y) { 
    } 
}; 

template <> 
template <class T> 
struct Foo<myC<T> > 
{ 
    static void f(myC<T> y) { 
    } 
}; 

欠点は、クラステンプレートが自動的にテンプレートパラメータを解決しないということです。しかし、それはeaslily元に、関数テンプレートと似て解決することができます:関数の場合には許可されていません

template <class U> 
void f(U y) { 
    return Foo<U>::f(y); 
} 
部分専門と呼ばれているあなたがここでやっているatttemptingいる
4
template <> 
template <class T> 
void f<myC<T> >(myC<T> y) { 
} 

テンプレート。

機能テンプレートは、完全にのいずれかに特化されているか、まったく特殊化されていません。関数テンプレートのいかなる部分的な特殊化は、言語仕様によって許可されていません。テンプレートの特殊化を許可され、さらには完全にオーバー好ましい

template <class T> 
void f(myC<T> y) //note that it is overload, not specialization 
{ 
} 

:として

だからできる過負荷関数テンプレート。

はハーブサッターすることにより、これらの記事を読む:

+0

C++ 11では導入されていませんでしたか? –

関連する問題