2011-07-21 43 views
17

Tôi có một lớp templated với một chức năng thành viên templatedChuyên ngành chức năng thành viên templated trong lớp templated

template<class T> 
class A { 
public: 
    template<class CT> 
    CT function(); 
}; 

Bây giờ tôi muốn chuyên chức năng thành viên templated trong 2 cách. Đầu tiên cho có loại giống như lớp:

template<class T> 
template<> // Line gcc gives an error for, see below 
T A<T>::function<T>() { 
    return (T)0.0; 
} 

Thứ hai cho loại bool:

template<class T> 
template<> 
bool A<T>::function<bool>() { 
    return false; 
} 

Dưới đây là cách tôi đang cố gắng thử nghiệm nó:

int main() { 
    A<double> a; 
    bool b = a.function<bool>(); 
    double d = a.function<double>(); 
} 

Bây giờ gcc mang lại cho tôi cho dòng được đánh dấu ở trên:

error: invalid explicit specialization before ‘>’ token 
error: enclosing class templates are not explicitly specialize 

Vì vậy, gcc đang nói với tôi, rằng tôi phải chuyên A, nếu tôi muốn chuyên chức năng, phải không? Tôi không muốn làm điều đó, tôi muốn loại lớp bên ngoài được mở ...

Câu trả lời cuối cùng: điều đó là không thể? Hay là có cách nào?

+0

có thể trùng lặp của http://stackoverflow.com/q/3040201/498253 – Tom

Trả lời

13

Vâng, đây là vấn đề:

error: enclosing class templates are not explicitly specialized 

Bạn không thể chuyên một thành viên mà không còn chuyên cung cấp các lớp học.

Những gì bạn có thể làm là đặt mã từ function trong một lớp riêng biệt và chuyên môn đó, giống như basic_string phụ thuộc vào một lớp char_traits riêng biệt. Sau đó, không chuyên ngành function có thể gọi người trợ giúp trong lớp đặc điểm.

6

Bạn có thể sử dụng quá tải, nếu bạn thay đổi cài đặt.

template <typename T> 
class Foo 
{ 
public: 
    template <typename CT> 
    CT function() { return helper((CT*)0); } 

private: 
    template <typename CT> 
    CT helper(CT*); 

    T helper(T*) { return (T)0.0; } 

    bool helper(bool*) { return false; } 
}; 

đơn giản và dễ dàng :)

Các vấn đề liên quan