2012-01-24 11 views
-2

可能性の重複:
Where and why do I have to put the “template” and “typename” keywords?C++の特性と専門

私は簡潔に、いくつかの一般的なルーチンに関連したタイプを関連付けるために私を可能にするために、初めての特性を使用しようとしています。しかし、私は構文に苦しんでいるし、グーグルはこの種のものを実装するための簡単な例を示していないようだ。ここで私は、現在持っているものの凝縮例です。

template <typename T> struct foo_traits { }; 

template<> struct foo_traits<int> { 
    typedef unsigned char T2; // sub-type for int specialisation of foo_traits 
}; 

template <typename T> T foo(void) 
{ 
    typedef foo_traits<T> traits_type; // OK 
    typedef traits_type::T2 T2; // error here: "Too few template-parameter-lists" 

    T i 
    T2 j; 

    // ... 
} 

私は私の汎用テンプレート機能fooでそれを使用できるようにfoo_traitsからT2のtypedefを取得するための正しい方法は何ですか?

+2

ことになっているコンパイラに指示する必要があります。 FAQの項目を見つけてみましょう... – Mankarse

+0

ありがとうございます - 私は当然最初に検索しようとしましたが、関連する複製を見つけることができれば感謝しています –

+0

また、どのようにして一般的なケースで機能すると思いますか? 'int'以外の' T'の場合、 'traits_type :: T2'は単に存在しません。 – Mankarse

答えて

2

奇数エラーメッセージが表示されていますが、実際には、ネストされたT2は、別の重複...(ヒント - あなたは `typename`を必要とする)タイプ名

typedef typename traits_type::T2 T2; 
+0

ありがとうございます。これは問題を解決します。なぜそれが修正されたのかわからない - この種のことについてまともな本に投資する時間はあるだろう - どんな提案? –

+1

Vandevoorde&Josuttisの_C++ Templates_は良いです。私は何かがまだ利用可能であるかどうかはまだ分かりませんが、これはC++ 11もカバーしています。 – Useless

+0

@Useless:本のお薦めをありがとう - 私のAmazonの "wish list"に追加されました! –

関連する問題