テンプレート化されたクラスを定義するために、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
は誰もが知っていますか?
ありがとう!私は宣言をテンプレートクラスのインスタンス化から分離しているので、明示的なインスタンス化を行う必要があります。 – Javier
@ Javierテンプレートコードを '.cpp'ファイルの中に入れると、コンパイラはそれを行うことができないので、すべてのテンプレートを明示的にインスタンス化する必要があります。しかし、あなたが抱えている問題は無関係です。テンプレート化されたメソッドがあり、存在しない非テンプレートメソッドを呼び出そうとしています。 –
[OK]を、ので、私が持っている必要があります:テンプレート クラスバー{ .... テンプレート フー * doSomethingの(int)を、 .... };あなたが示唆しているのはそれですか?そして、もし私がFoo *を返すことをいつも好きでないならどうしますか?申し訳ありませんが、私は少し混乱しています。どのようにdoSomethingメソッドを呼び出すことができるのかについての 'main.cpp'の例を含めて欲しいですか? –
Javier