6

ここのnoobはまだテンプレートを試しています。メッセージ処理クラステンプレートを作成しようとしています

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とは何かを定義するために必要なヘッダーファイルを追加しました。私はこれまで何度もこの関数を使用しましたが、このコンテキストでは使用していません。

テンプレート関数が未定義のクラステンプレート(特殊化されていない?)内で完全に定義されている(特殊化されている?)という事実をコンパイラーが気に入らないのではないかと思います。テンプレートを「特殊化」するものを完全に理解しているわけではありません。ほとんどの説明は「完全」または「部分的」の概念に焦点を当てていますが、そもそもそれを専門にするものではありません。

より多くのコードを見たい場合はお詫びします。私は職場でインターネットにアクセスできず、そこでこれを行っているので、すべてを精神的な「スクラッチパッド」に入れて家に持ち帰る必要があります。

4

6 に答える 6

11

メンバー関数'foo'には戻り型が必要であり、依存式(意味が直接または間接的に汎用テンプレートパラメーターに依存する式)でメンバーテンプレートを使用する場合は、キーワード'template'を使用する必要があります。

t_->template getMessageSender<MessageType>();  // ok
t_->getMessageSender<MessageType>(); // not ok

おそらく、この例は、メンバーテンプレートの前に「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

  }

};

お役に立てば幸いです。

于 2009-07-07T07:33:27.353 に答える
2

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

t_->template getMessageSender<MessageType>();
于 2009-07-07T07:41:29.490 に答える
0

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

そうでない場合、どのようにgetMessageSender宣言され、どのように宣言されMessageTypeますか?

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

また、エラーメッセージには通常、インスタンス化が試みられたタイプが含まれています。少なくとも完全なエラーメッセージを投稿してみてください。

于 2009-07-07T07:32:03.657 に答える
0

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

t_->getMessageSender<MessageType>();
于 2009-07-07T07:33:53.293 に答える
0

欠落しているのは、関数の戻り型だけです。t_メンバーは完全に定義されています。

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

部分的な特殊化は、すべてのテンプレート引数が提供されているわけではないジェネリックコードの実装です。

于 2009-07-07T09:10:28.747 に答える
0

これは、VisualStudio2010コンパイラで正常に機能します。

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

答えを最新の状態に保つためだけに!!!

于 2011-01-05T03:04:13.400 に答える