Tôi biết rằng cú pháp cho tuyên bố một phương pháp lớp mẫu trong một tiêu đề và xác định nó trong một tập tin nguồn diễn ra như vậy:C++ - Tờ khai riêng/độ nét cho mẫu hàm trong lớp mẫu
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;
}
Nhưng nếu phương pháp này cũng là một mẫu? Tôi đang thêm phương thức vào lớp basic_string
và tôi muốn biết cách viết triển khai cho các hàm.
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);
// ...
};
Làm thế nào tôi có thể thực hiện template <class _ValTy> static String ConvertFrom(_ValTy val);
? Bởi vì bây giờ không chỉ tôi cần phải xác định mẫu lớp, mà còn là khuôn mẫu hàm. Tôi đặt cược mã tôi sắp viết không hợp lệ, nhưng nó sẽ hiển thị những gì tôi đang cố gắng để hoàn thành:
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...
}
Tôi không tiên tiến ở tất cả với các mẫu. Không chỉ tôi rất nghi ngờ rằng ở trên là hợp lệ, nó có vẻ cồng kềnh để viết và không phải là rất dễ đọc. Làm thế nào tôi sẽ đi về việc thực hiện các phương thức mẫu, và các phương thức mẫu tĩnh trả về kiểu lớp riêng của nó? Bởi vì tôi không muốn định nghĩa chúng trong tiêu đề.
Có lẽ bạn nên đọc: [Tại sao các mẫu chỉ có thể được triển khai trong tệp tiêu đề?] (Http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the- tập tin tiêu đề). –
@JesseGood Điều đó cho tôi thấy rằng có một cách để thực hiện phương thức * bình thường * từ một lớp mẫu trong một tệp nguồn riêng biệt, nhưng không phải cách thực hiện các phương thức * templated * từ một lớp mẫu. Có lẽ tôi đang nhìn một cái gì đó trong bài viết, tôi không muốn là anh chàng đó. Tôi có nên từ bỏ và tiếp tục và xác định các phương thức lớp nội tuyến trong tệp tiêu đề không? –
Nếu bạn chỉ đang cố gắng tách các nguyên mẫu khỏi chức năng cho các hàm/lớp mẫu, bạn có thể thử sử dụng mô hình .inl: nơi chức năng thực tế là tệp .inl và bạn bao gồm tệp đó ở cuối tệp tiêu đề của mình. – Alex