2015-10-29 13 views
16

Tôi muốn chỉ định nghĩa một hàm dựa trên kích thước của mẫu tham số:Cách sử dụng> (lớn hơn) bên trong thông số mẫu và không nhận được lỗi phân tích cú pháp?

template <class T> 
typename std::enable_if<sizeof(T) > 1, void>::type 
foobify(T v) { 
    // ... 
} 

int main() { 
    //foobify((unsigned char)30); // should not compile 
    foobify((long)30); 
} 

Tuy nhiên, tôi nhận được:

main.cpp:8:41: error: expected unqualified-id before numeric constant 
    typename std::enable_if<sizeof(T) > 1, void>::type 

Nó hoạt động nếu tôi thay vì làm 1 < sizeof(T). Vì vậy, tôi tin rằng GCC đang nghĩ rằng tôi đang kết thúc tham số mẫu, thay vì tiếp tục biểu thức boolean.

Có cách nào để tự mình sử dụng > mà không phải giải quyết nó không?

+2

Cũng xem [Toán tử và mẫu-id] (http://stackoverflow.com/q/28354108/1708801) –

+2

Bạn cũng có thể sử dụng 'is_greater'' typename std :: enable_if :: type': PPPPP – 101010

Trả lời

22

Vâng, biểu thức sử dụng nhà điều hành phải được ngoặc. Xem [temp.names]/3:

Khi phân tích một mẫu -luận-list, là người đầu tiên không lồng nhau > được thực hiện như là kết thúc delimiter chứ không phải là một người tôn trọng hơn điều hành . [..] [Ví dụ:

template<int i> class X { /* ...*/ }; 

X< 1>2 > x1; // syntax error 
X<(1>2)> x2; // OK 

- end dụ]

138) Một > mà có chứa loại-id của một dynamic_cast, static_cast, reinterpret_cast hoặc const_cast, hoặc bao quanh mẫu-đối số s của mẫu-id tiếp theo, được coi là lồng nhau cho mục đích của mô tả này.

Rõ ràng đó không áp dụng nếu bạn sử dụng các đối tác đối xứng so sánh đó, ví dụ: sử dụng <, thay vào đó - phân tích cú pháp là rõ ràng trong trường hợp đó.

12

ngoặc Có, bạn nên sử dụng:

template <class T> 
typename std::enable_if<(sizeof(T) > 1), void>::type 
foobify(T v) { 
    // ... 
} 
Các vấn đề liên quan