2010-11-18 10 views
5

テンプレート化されたクラスを定義するために、3つの異なるファイルを検討します。宣言は.hファイルにあり、メソッドimplentationsは.cppファイルにあり、明示的なインスタンス化は.incファイルに含まれています(.cppの末尾に行を追加すると、たとえば#include "bar-impl.inc")。テンプレート以外のパラメータ化されたメソッドからテンプレートの型を返す

ここに私の問題があります。私は2つのテンプレートクラス、例えば:Foo<S>Bar<T>を持っています。 Bar<T>クラスの内部 、私は、コンパイラが何を知らないので

template<class T> 
class Bar{ 
.... 
template <class FooType> 
FooType* doSomething(int); 
.... 
}; 

(私の明示的なインスタンスと私はそれは、例えば、Foo<float>*になりたい)テンプレートの種類FooType*を返すメソッドをしましたFooType*は、bar-impl.incファイルのdoSomethingメソッドを明示的にインスタンス化しようとしました。

//bar-impl.inc 
template class Foo<float> * Bar<float>::doSomething(int); 

しかし、それは動作しませんでしたし、私はのエラーを取得:それはそれを行うことが可能かどうno matching function for call to ‘Bar<float>::doSomething(int&)’ make: *** [main] Error 1

は誰もが知っていますか?

答えて

1

メソッドテンプレートは、関数テンプレートとまったく同じ方法で動作します。テンプレートパラメータを呼び出しから派生させない限り、使用時に明示的にインスタンス化する必要があります。

だから、あなたは本当にあなたが何をする必要があるか、特殊化を行う必要はありませんが、使用時にFooTypeを指定します:

Bar<float> somevar; somevar.doSomething< Foo<float> >(somevalue);

あなたは常にFoo<T>*を返すようにしたい場合は、単にFoo<T>* doSomething(int);

を使用
+0

ありがとう!私は宣言をテンプレートクラスのインスタンス化から分離しているので、明示的なインスタンス化を行う必要があります。 – Javier

+0

@ Javierテンプレートコードを '.cpp'ファイルの中に入れると、コンパイラはそれを行うことができないので、すべてのテンプレートを明示的にインスタンス化する必要があります。しかし、あなたが抱えている問題は無関係です。テンプレート化されたメソッドがあり、存在しない非テンプレートメソッドを呼び出そうとしています。 –

+0

[OK]を、ので、私が持っている必要があります:テンプレート クラスバー{ .... テンプレート フー * doSomethingの(int)を、 .... };あなたが示唆しているのはそれですか?そして、もし私がFoo *を返すことをいつも好きでないならどうしますか?申し訳ありませんが、私は少し混乱しています。どのようにdoSomethingメソッドを呼び出すことができるのかについての 'main.cpp'の例を含めて欲しいですか? – Javier

関連する問題