ヘッダーでテンプレートクラスメソッドを宣言し、ソースファイルで定義するための構文は次のようになります。
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...
}
私はテンプレートについてはまったく進んでいません。上記が有効であるかどうか非常に疑わしいだけでなく、書くのが面倒で、あまり読みにくいようです。テンプレートメソッドと、独自のクラスタイプを返す静的テンプレートメソッドを実装するにはどうすればよいですか?ヘッダーでそれらを定義したくないからです。