2010-05-30 29 views
9

tôi có lớp học với các phương pháp mẫu mà nhìn này:boost :: enable_if lớp mẫu phương pháp

struct undefined {}; 

template<typename T> struct is_undefined : mpl::false_ {}; 

template<> struct is_undefined<undefined> : mpl::true_ {}; 

template<class C> 
struct foo { 
     template<class F, class V> 
     typename boost::disable_if<is_undefined<C> >::type 
      apply(const F &f, const V &variables) { 
     } 

     template<class F, class V> 
     typename boost::enable_if<is_undefined<C> >::type 
      apply(const F &f, const V &variables) { 
     } 
}; 

rõ ràng, cả hai mẫu được khởi tạo, kết quả là lỗi thời gian biên dịch. là sự khởi tạo của các phương thức mẫu khác với việc khởi tạo các hàm miễn phí? Tôi đã sửa lỗi này theo cách khác, nhưng tôi muốn biết điều gì đang xảy ra. điều duy nhất tôi có thể nghĩ rằng có thể gây ra hành vi này, tạo điều kiện cho tình trạng không phụ thuộc tham số mẫu ngay lập tức, nhưng lập luận mẫu chứ không phải lớp

Cảm ơn bạn

Trả lời

12

C không tham gia vào khấu trừ cho apply của bạn. Xem this answer để có giải thích sâu hơn về lý do mã của bạn không thành công.

Bạn có thể giải quyết nó như thế này:

template<class C> 
struct foo {  
     template<class F, class V> 
     void apply(const F &f, const V &variables) { 
      apply<F, V, C>(f, variables); 
     } 

private: 
     template<class F, class V, class C1> 
     typename boost::disable_if<is_undefined<C1> >::type 
      apply(const F &f, const V &variables) { 
     } 

     template<class F, class V, class C1> 
     typename boost::enable_if<is_undefined<C1> >::type 
      apply(const F &f, const V &variables) { 
     } 
}; 
+0

cảm ơn bạn một lần nữa. – Anycorn

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