Tôi nghĩ có một sự hiểu lầm ở đó.
Có hai loại mẫu:
- các lớp mẫu
- mẫu phương pháp
Trong ví dụ của bạn, bạn có một lớp mẫu, trong đó tất nhiên có chứa một số phương pháp. Trong trường hợp này, bạn sẽ phải chuyên lớp đó.
template <class A>
class C<A,CObject>
{
void foo() { ... } // specialized code
};
Vấn đề trong ví dụ của bạn là tương đối đơn giản: bạn xác định phương pháp foo cho chuyên môn hóa C nhưng chuyên môn hóa này chưa bao giờ được công bố trước.
Vấn đề ở đây là bạn phải hoàn toàn chuyên về lớp C của bạn (và do đó sao chép rất nhiều dữ liệu). Có một số cách giải quyết.
- Thừa kế (Thành phần?): làm tất cả công việc phổ biến trong lớp cơ sở, sau đó có lớp C kế thừa và chuyên môn thích hợp
- Bạn bè: thay vì có phương pháp 'foo' là thành viên của C, hãy xác định nó là một chức năng miễn phí của người bạn và chuyên chỉ phương pháp này
- Phái đoàn: có phương pháp 'foo' của bạn gọi một phương pháp 'bar', mà là một chức năng miễn phí, và chuyên 'bar' một cách thích hợp
nào trong mã cho:
// 1- Inheritance
template <class A, class B>
class CBase
{
// Everything that does not require specialization
};
template <class A, class B>
class C: public CBase<A,B>
// depending on your need, consider using another inheritance
// or even better, composition
{
void foo(); // generic
};
template <class A>
class C<A,CObject> : public CBase<A,CObject>
{
void foo(); // specialized
};
// 2- Friend
// note the change in signature:
// - now you need to pass the attributes to be changed
// - the last parameter helps differentiating the overload
// as there is no specialization for functions
template <class A, class B> void foo(Arg1&, Arg2&, const B&);
template <class A> void foo(Arg1&, Arg2&, const CObject&);
template <class A, class B>
class C
{
friend template <class, class> foo;
};
// 3- Delegation
// same signature as foo in (2)
template <class A, class B> void bar(Arg1&, Arg2&, const B&);
template <class A> void bar(Arg1&, Arg2&, const CObject&);
template <class A, class B>
class C
{
void foo() { bar(member1, member2, B()); }
};
Hy vọng nó làm rõ, và giúp!
Nguồn
2009-10-08 06:23:39
Có một số cách được hiển thị trên các câu trả lời khác: http://stackoverflow.com/questions/1501357/template-specialization-of-particular-members/1501455#1501455 –