2011-10-15 31 views
9

Tôi cố gắng để thực hiện một SFINAE sử dụng bool (không giống như phổ biến void_trick):SFINAE thử với bool cho lỗi biên dịch: "mẫu tranh luận 'T :: giá trị' liên quan đến mẫu tham số"

template<typename T, bool = true> 
    struct Resolve 
    { 
    static const bool value = false; 
    }; 

    template<typename T> 
    struct Resolve<T, T::my_value> 
    { 
    static const bool value = true; 
    }; 

Mục đích là để chuyên, các lớp học có static const bool my_value = true; được định nghĩa bên trong nó. Nếu chúng được xác định false hoặc không được xác định thì không chuyên nó. ví dụ:

struct B1 { // specialize Resolve for this case 
    static const bool my_value = true; 
}; 
struct B2 { // don't specialize 
    static const bool my_value = false; 
}; 
struct B3 {}; // don't specialize 

Khi áp dụng các thủ thuật ở trên B1 nó mang lại cho các lỗi biên dịch:

Resolve<B1>::value; 

error: template argument ‘T::my_value’ involves template parameter(s)

Tôi biết rằng điều này có thể đạt được với cách thay thế. Tuy nhiên, tôi quan tâm đến việc biết, tại sao nó cung cấp cho trình biên dịch lỗi ở đây và nó có thể được giải quyết trong mã này chính nó?

Trả lời

20

thực tế những gì bạn đang làm bị cấm bởi phần §14.5.4/9 mà nói,

A partially specialized non-type argument expression shall not involve a template parameter of the partial specialization except when the argument expression is a simple identifier.

Bí quyết có thể được sử dụng một loại cho tham số mẫu thứ hai là tốt, đóng gói các phi -type giá trị, như được mô tả bên dưới:

template<bool b> struct booltype {}; 

template<typename T, typename B = booltype<true> > 
struct Resolve 
{ 
    static const bool value = false; 
}; 

template<typename T> 
struct Resolve<T, booltype<T::my_value> > 
{ 
    static const bool value = true; 
}; 

Bây giờ nó compile fines.

+0

Giải pháp tốt. Tôi đã chỉnh sửa một số phần và ví dụ. Đối với yêu cầu cụ thể của tôi, tôi muốn khám phá thủ thuật 'bool' thay vì mẹo' void_' cho SFINAE. Ngoài ra, nếu nó bị cấm theo tiêu chuẩn thì tôi nghĩ tôi nên chấp nhận câu trả lời này, bởi vì tôi không thấy cách nào khác. – iammilind

+0

Vâng, chỉnh sửa cũng được. Tôi nghĩ rằng bạn có thể sử dụng các thành viên trong 'bool2type', đó là lý do tại sao tôi thêm nó. Nhưng nếu bạn không cần nó, thì nó hoàn toàn ổn với tôi. – Nawaz

+0

Ahh, đây chính xác là giải pháp tôi cần cho vấn đề của mình. [Câu hỏi 15115109] (http://stackoverflow.com/questions/15115109/how-to-convert-templated-function-overloads-to-partial-specialized-templated-cla) Tôi đã tiến thêm một bước nữa bằng cách sử dụng std :: integral_constant , và những cái có sẵn trực tiếp thông qua thành viên type_traits '":: type". –

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