2009-07-07 16 views
5

ここでテンプレートはまだ実験中です。メッセージ処理クラステンプレートを書き込もうとしています。クラステンプレート内のテンプレートクラス(C++)

template <typename T> class MessageProcessor { 

    //constructor, destructor defined 
    //Code using t_ and other functions 
foo(void) { 

//More code in a perfectly fine method 
} 
    private: T *t_ 

}; 

すべてがヘッダーファイルで定義されています。私はクラスを構築し、テストして、すべてがうまくいきます。さて、私はこれをやろうとしている:

template <typename T> class MessageProcesor { 

    //Same stuff as before 

foo(void) { 
//Same code as before in foo, but one new line: 
    t_->getMessageSender<MessageType>(); 

} 

private: T *t_; 
}; 

しかし、この行は「>」トークンの前に私の悪い表現型のエラーが発生します。

MessageTypeの定義に必要なヘッダーファイルを追加しました。私はこれまで何度もこの関数を使用してきましたが、この文脈ではありません。

私は、コンパイラは、未定義のクラステンプレート内でテンプレート関数が完全に定義されている(特殊化されていませんか?私は、テンプレートを「専門化する」ことを完全にgrokkingしていません。ほとんどの説明は、「完全」または「部分的」という概念を中心にしていますが、最初はそれを専門にするものではありません。

もっとコードを見たい場合はお詫び申し上げます。私は仕事でインターネットにアクセスできず、これが私がやっているところなので、私は精神的な「スクラッチパッド」にすべてを入れて帰宅させなければなりません。

+2

ここにgetMessageSender関数コードを投稿してください。 –

+0

食べ物に戻り値の型がありません。それはあなたの問題です –

+0

あなたの所見はすべて正しいです。しかし、それらはタイプミスでした。実際の問題は、Faisal – user106740

答えて

9

おそらくこの例は、メンバテンプレートの前に 'template'キーワードを付ける必要がある場合に役立ちます[注意:対称性のために、メンバテンプレートでは常に 'template'プレフィックスを使用できますが、非依存式で使用する場合はオプションです。

struct MyType 
{ 
    template<class T> void foo() { } 
}; 

template<class U> 
struct S 
{ 
    template<class T> 
    void bar() 
    { 
    MyType mt; // non-dependent on any template parameter 
    mt.template foo<int>(); // ok 
    mt.foo<int>(); // also ok 

    // 't' is dependent on template parameter T 
    T t; 
    t.template foo<int>(); // ok 
    t.foo<int>(); // not ok 

    S<T> st; // 'st' is dependent on template parameter T 
    st.template foo<int>(); // ok 
    st.foo<int>(); // not ok 


    S<MyType> s; // non-dependent on any template parameter 
    s.bar<int>(); // ok 
    s.template bar<int>(); // also ok 

    } 

}; 

希望します。

+0

によって答えられる「テンプレート」キーワードがないことでした。どのコンパイラでそれを行う必要がありますか? –

+0

@Edouard - 標準ではテンプレートパラメータに依存する識別子からメンバテンプレートにアクセスするときにのみ 'template'プレフィックスが必要です - ほとんどのコンパイラは'98年から標準の一部となっているので簡単にするために、すべてのメンバーテンプレートアクセスでそれを使用できるようにするためのルール - EDGコンパイラ以外にも(これは主にこの権利を得ます)、他のコンパイラではチェックしていません。あなたが持っているかどうかを知る。 –

0

おそらく、その時点でMessageTypeは不明です。インクルード、名前空間の解決、宣言がありませんか?

もしそれがなければ、getMessageSenderはどのように宣言されていますか?MessageTypeはどうですか?

一般に、C++では、Tがその時点でわからないと問題はありません(まあ、複雑ですがそれでも)。

また、エラーメッセージには、通常、抑止しようとするタイプが含まれています。少なくとも完全なエラーメッセージを投稿してください。

「foo」であなたのメンバ関数は、戻り値の型を必要とし、あなたが依存の表現(その意味汎用テンプレートパラメータに直接的または間接的に依存している表現)

t_->template getMessageSender<MessageType>(); // ok 
t_->getMessageSender<MessageType>(); // not ok 
でメンバーテンプレートを使用する場合、キーワード「テンプレート」を使用する必要があります

0

getMessageSenderのような、テンプレート化されたメソッドへの同様の呼び出しがありますか?

t_->getMessageSender<MessageType>(); 
2

->とテンプレートメソッドの名前の間でキーワードtemplateを追加します。

t_->template getMessageSender<MessageType>(); 
0

それが欠けているあなたの機能のほんの戻り値の型です。 t_メンバーは完全に定義されています。

テンプレートの特殊化は、特定のテンプレート引数用に実装する「特別な」バージョンです。例:std::vectorは、汎用std::vectorの特殊バージョンです。

部分的な特殊化は、すべてのテンプレート引数が提供されていない汎用コードの実装です。

0

これはVisual Studio 2010コンパイラで正常に動作します。

class One 
{ 
public: 
    void newFoo() ; 
    template < class T > void foo() 
    { 
     T obj ; // obj is dependent on template parameter 
     obj.newFoo() ; // and this works 
    } 
} 

ちょうど答えを更新し続ける!

関連する問題