2012-10-18 43 views
3

可能重複:
Why should the implementation and the declaration of a template class be in the same header file?派生類中定義的頭文件和定義模板,以CPP文件

我試圖定義一個頭文件模板,定義它在一個cpp文件中,模板應該在派生類中定義。所以這是我得到:

頭文件:

#ifndef ........ 
#define ..... 
template <class mytypename> 
class abcBaseClass:public abcDerivedClass{ 
public: 
    mytypename getvalue(char*) 
}; 
#endif 


源文件:

mytypename abcDerivedClass<mytypename>::getvalue(char* name){ 

} 

我只是想知道這是做的正確方法它?。

這就是我想實現......我想打這個電話是

double x = a->getvalue<double>(char) 
+0

實現必須以與聲明相同的文件結束,除非您顯式實例化類型。 'typename'也是一個保留字。 –

+0

正確的方法是將整個模板定義放在標題中。 –

+0

你真的想做什麼? 'typename'不是模板參數的有效名稱,在那個代碼中,'base'繼承自'derived',這至少是一個反直覺的名稱選擇。 –

回答

0

最後一種方法不,這不是正確的方法:

應該這樣做方法:

#ifndef ........ 
#define ..... 
template <class T> 
class abcBaseClass:public abcDerivedClass{ 
public: 
    T getvalue(char*) 
}; 

#endif 

和.cpp文件: 模板 牛逼abcBaseClass ::的GetValue(字符* CH){}

你的代碼不正確的原因是因爲typename是一個C++關鍵字。而且必須編譯

中拋出一個錯誤你也可以使用:

#ifndef ........ 
#define ..... 
template <typename T> 
class abcBaseClass:public abcDerivedClass{ 
public: 
    T getvalue(char*) 
}; 
#endif 

,並在C++文件:

template<class T> 
T abcBaseClass<T>::getvalue(char * ch){ 
} 
+0

好吧,你不能像C++中的其他東西一樣將模板的定義放入.cpp文件中。有一個解決方法,但它仍然不同於你通常分開標題/源文件 –

2

類似的問題已經被問了很多次的SO了。

但無論如何...

首先,你犯了一些語法錯誤。

而不是

​​

它應該是這樣的。

#ifndef ........ 
#define ..... 
template <typename T> 
class abcBaseClass:public abcDerivedClass{ 
public: 
    T getvalue(char*); 
}; 
// Definition follow in this file! 
// For reasons or work-arounds, read below. 
#endif 

另外,模板聲明和定義都應該放到同一個文件中。 一個例外是,當您將該模板實例化爲模板定義所在的源文件中的某種類型時。

就是這樣。

#include "this_template.h" 

template <typename T> 
// all sorts of definitions... 

// Explicit instantiate this template!!!! 
template class abcBaseClass<Your_Type_Goes_Here>; 

注意,這種方法的一個根本缺陷是,你只能使用你在這個源在程序中其他地方文件中明確實例的類型。嘗試使用其他類型實例化此模板會導致鏈接器抱怨無法找到匹配的定義。

如果你堅持模板是通用的,並在其他地方定義模板類。 你可以把定義到另一個頭文件,只是把它像this_template_impl.h,包括this_template.hthis_template_impl.h

然後,在你的源文件,而不是#include "this_template.h",你寫#include "this_template_impl.h

+0

嘿非常感謝。我正試圖在一個文件中完成它,我希望定義是如何完成的......這是否適合你說的墊子? abcDerivedClass :: getvalue(char * name) – vadugs

1

你可以把定義一個.cpp文件,但它更麻煩,而不是模板通常完成的方式。

你需要一些額外的代碼在.cpp說服編譯器填寫必要的模板參數,生成功能的一種方法是隻使用某種方式的功能:

mytypename abcDerivedClass<mytypename>::getvalue(char* name){ 

} 

void dummy() 
{ 
    abcDerivedClass<double> temp; 
    temp->getvalue(NULL); 
} 

有沒有必要實際上調用虛函數,只需將它放在那裏(在模板定義之後)就足夠了。

我敢肯定,還有另一種方式來顯式實例化模板,但因爲我不這樣做,我永遠不會記住。

+0

這只是'template mytypename abcDerivedClass :: getvalue(char *);'' –

相關問題