2010-11-18 131 views
5

要定義模板化類,我考慮三個不同的文件。該聲明位於.h文件中,方法實現位於.cpp文件中,並且明確的實例包含在.inc文件中(通過在.cpp末尾添加一行,例如:#include "bar-impl.inc")。從非模板參數化方法返回模板類型

現在,這是我的問題。我有兩個模板類,例如:Foo<S>Bar<T>。 裏面的Bar<T>類的,我有一個返回模板類型FooType*的方法(這與我的顯式實例,我想它是,例如,Foo<float>*

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

由於編譯器不知道是什麼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 2010-11-18 16:55:05

+0

@Javier如果你把你的模板代碼放在'.cpp'文件中,那麼你需要明確地實例化所有的模板,因爲編譯器不能爲你做。但是你遇到的問題是無關的。你有一個模板化的方法,並試圖調用一個非模板方法(它不存在)。 – 2010-11-18 16:57:28

+0

好,所以,我應該有:模板 Bar類{ .... 模板 * DoSomething的(INT); .... };你在暗示什麼?如果我不想總是返回Foo *。對不起,我有點困惑。你介意在我怎樣稱之爲doSomething方法中包含'main.cpp'例子? – Javier 2010-11-18 17:01:28