2012-02-28 16 views
2

テンプレートタグ:私は、次のコードに私の混乱を凝縮させるために管理している困惑

template<typename T> 
class BTI { 
public: 
    char func(char); 
}; 

template<int i> 
class Tag {}; 

template<int i> unsigned char 
BTI<Tag<i> >::func(char c) { 
    return c; 
} 

これはに意図されています

  1. はテンプレートクラスBTIを宣言し、
  2. を宣言しますテンプレート化されたタグクラスTagおよび
  3. funcのテンプレートに特化した実装を提供します。BTIのテンプレートパラメータはTag<i>です。

私はg++ -fsyntax-onlyを介してこれを実行して、私が取得(G ++ 4.1.2を使用。):

test.cc:11: error: invalid use of undefined type ‘class BTI<Tag<i> >’ 
test.cc:2: error: declaration of ‘class BTI<Tag<i> >’ 
test.cc:11: error: template definition of non-template ‘unsigned char BTI<Tag<i> >::func(char)’ 

私はこの時点で試して何をしてもわかりません。何か案は?

+0

しかしBTIはテンプレート化されていないので、それはTをまったく使用しません。また、特殊化によって、charではなくunsigned charが返されます。 – vulkanino

+0

funcはテンプレート関数ではないため、特殊化することはできません。私はあなたがクラス全体を専門化しなければならないかもしれないと思うかもしれないし、あるいはfuncをフリースタンディングヘルパー(テンプレート)関数にするかもしれないと思う。私は遊びを持っていきます... – BoBTFish

+0

'' func'が関数テンプレートであっても、* B * BTFTFishに加えられた*部分的な*特殊化を試みるため*まだ*特殊化できません。テンプレート(クラステンプレートに反する)。 –

答えて

3

あなたが試みようとしていることを試しているのであれば、1つの機能だけでなく、BTIを完全に専門にする必要があります。このように:

template<typename T> 
class BTI { 
public: 
    unsigned char func(char); 
}; 

template<int i> 
class Tag {}; 

template<int i> 
class BTI<Tag<i> > { 
public: 
    unsigned char func(char); 
}; 

template<typename T> unsigned char 
BTI<T>::func(char c) { 
    return 'X'; 
} 

template<int i> unsigned char 
BTI<Tag<i> >::func(char c) { 
    return c; 
} 

int main() { 
    BTI<int> x; 
    BTI<Tag<0> > y; 
    std::cout << x.func('a') << std::endl; 
    std::cout << y.func('a') << std::endl; 
} 

これは最初の'X'(一般の場合)、その後、'a'(専門的なケース)を印刷します。

+0

はい。 BoBTFishとKonrad Rudolphによる上記のコメントに加えて、これは優れています。ありがとう! – fiddlemath

+0

特に、あなたのバージョンは 'class BTI 'の定義なしでは動作しませんが、' func'が完全に特殊化されていれば 'class BTI 'の定義なしで*動作します。 { 'テンプレート<>符号なしの文字BTI > :: func(char c){return c;}' ) @Konradのコメントとまったく同じものです。 :) – fiddlemath

関連する問題