C言語でクラステンプレート内のテンプレートクラス++
-
11-09-2019 - |
質問
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のが何であるかを定義するために必要なヘッダファイルを追加しました。私はない、この文脈では、以前にこの機能の多くの時間を使用しました。
私は(専門?)コンパイラは、テンプレート機能が完全に定義されているという事実が好きではないと思われる未定義のクラステンプレート内(未分化?)。私は完全に「専門」のテンプレートを作るものgrokkingていませんよ。ほとんどの説明は、「フル」または「部分的」の概念を中心にではなく、何が最初の場所に特化なります。
謝罪、あなたはより多くのコードを参照したい場合。私は仕事で何のインターネットアクセスを持っていないし、それは私がこれをやっているところですので、私は私の精神的な「スクラッチパッド」にすべてを入れて、それを家に持って来るために持っています。
解決
あなたのメンバ関数「fooが」戻り値の型を必要とし、あなたが従属式でメンバーテンプレートを使用する場合、キーワード「テンプレート」を使用する必要があります(その意味汎用テンプレートパラメータに直接的または間接的に依存している表現)
t_->template getMessageSender<MessageType>(); // ok
t_->getMessageSender<MessageType>(); // not ok
対称性の利益のために、あなたは常にメンバーに「テンプレート」接頭辞を使用することができます:おそらく、この例では、メンバーテンプレートは、の「テンプレート」のキーワード[注意を前置されるようにのを必要とするとき、あなたが感謝するのに役立ちます非依存性発現に使用された場合、テンプレートが、それは任意です。
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
}
};
希望に役立ちます。
他のヒント
template
とテンプレートメソッドの名前の間でキーワード->
を追加します:
t_->template getMessageSender<MessageType>();
多分、のMessageTypeは、その時点で知られていません。あなたは、名前空間解像度や宣言を含める不足していますか?
THTはgetMessageSender
が宣言されているか、それではない、とどのようにMessageType
ているのですか?
一般的に、C ++にはTが、その点(まあ...それは複雑だが、それでも)で知られていない場合、問題はありません。
また、エラーメッセージは、通常、insantiatedしようとされているタイプを含みます。少なくとも完全なエラーメッセージを投稿してみます。
あなたがテンプレート化されているgetMessageSenderのようなメソッドに他の同様の電話を持っていますか?
t_->getMessageSender<MessageType>();
それはちょうど欠けているあなたの関数の戻り値の型です。 t_
部材が完全に定義されます。
テンプレートの特殊化は、あなたが特定のテンプレート引数に実装する「特別な」バージョンです。例:。std::vector
は、一般的なstd::vector
の特殊なバージョンです。
部分的な特殊化は、すべてのテンプレート引数が提供されていない、あなたの一般的なコードの実装です。
これは、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
}
}
ただ、更新の答えを維持する!!!