我知道一種用於在頭部聲明一個模板類方法和在一個源文件中定義它的語法變爲這樣:C++ - 在模板類模板函數獨立聲明/定義
myclass.h
template <typename T>
class MyClass {
public:
void method(T input);
private:
T privVar;
};
myclass.cpp
template <typename T>
void MyClass<T>::method(T input) {
privVar = input;
}
但是,如果該方法也是一個模板? 我有添加方法到basic_string
類,我想知道如何編寫函數的實現。
MyString.h
template <class _Elem = TCHAR,
class _Traits = std::char_traits<_Elem>,
class _Ax = std::allocator<_Elem>>
class String
: public std::basic_string<_Elem, _Traits, _Ax> {
private:
// Types for the conversion operators.
typedef _Elem* _StrTy;
typedef const _Elem* _ConstStrTy;
//...
public:
// Conversion operators so 'String' can easily be
// assigned to a C-String without calling 'c_str()'.
operator _StrTy() const {
return const_cast<_StrTy>(this->c_str());
}
operator _ConstStrTy() const {
return this->c_str();
}
// ... Constructors ...
/*------------ Additional Methods ------------*/
//! Converts a value of the given type to a string.
template <class _ValTy> static String ConvertFrom(_ValTy val);
//! Converts a string to the given type.
template <class _ValTy> static _ValTy ConvertTo(const String& str);
template <class _ValTy> _ValTy ConvertTo(void) const;
//! Checks if a string is empty or is whitespace.
static bool IsNullOrSpace(const String& str);
bool IsNullOrSpace(void) const;
//! Converts a string to all upper-case.
static String ToUpper(String str);
void ToUpper(void);
// ...
};
我怎麼能實現template <class _ValTy> static String ConvertFrom(_ValTy val);
?因爲現在不僅需要指定類模板,而且還需要函數模板。我打賭,我要寫的代碼是無效的,但它應該表現出什麼,我試圖完成:
MyString.cpp
template <class _Elem, class _Traits, class _Ax>
template <class _ValTy>
String<_Elem, _Traits, _Ax> String<_Elem, _Traits, _Ax>::ConvertFrom(_ValTy val) {
// Convert value to String and return it...
}
我不是先進的所有模板。我非常懷疑上述內容是否有效,寫起來似乎很麻煩,而且不易讀。我將如何去實現模板方法,以及返回它自己的類類型的靜態模板方法?因爲我不想在標題中定義它們。
您應該閱讀:[爲什麼模板只能在頭文件中實現?](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-首部的文件)。 –
@JesseGood這表明我有一種方法可以從源文件中的模板類單獨實現* normal *方法,而不是如何從模板類實現* templated *方法。也許我在帖子中忽略了一些東西,我不想成爲那個人。我應該放棄並繼續在頭文件中內聯定義類方法嗎? –
如果您只是試圖從模板函數/類的功能中分離出原型,則可以嘗試使用.inl範例:其中實際功能是.inl文件,並且將該文件包含在頭文件的末尾。 – Alex