2011-01-07 36 views
6

Tôi có một lớp đơn giản:Loại bỏ g ++ cảnh báo cho mẫu tham số

template<size_t N, typename T> 
class Int 
{ 
    bool valid(size_t index) { return index >= N; } 
    T t; 
} 

Nếu tôi xác định một thể hiện của lớp này như:

Int<0, Widget> zero; 

tôi nhận được một cảnh báo g ++:

warning: comparison is always true due to limited range of data type 

Tôi đã cố gắng thực hiện điều này, nhưng tôi không thể tìm ra cách chuyên biệt hóa một phần chức năng với tham số mẫu không phải kiểu. Có vẻ như không thể tắt cảnh báo này trong g ++. Cách thích hợp để ẩn cảnh báo này là gì, hoặc viết phương thức này sao cho nó luôn trả về true nếu N == 0?

Cảm ơn!

+0

trông giống như lỗi gcc –

+0

Bạn có cần đầy đủ 'size_t' hoặc bạn có thể sử dụng loại đã ký không? – Bill

+0

@Bill: Thật không may tôi cần toàn bộ phạm vi :-( – JaredC

Trả lời

7

Vì vậy, tôi đã đi lên với các giải pháp sau đây:

template<size_t N> 
bool GreaterThanOrEqual(size_t index) 
{ 
    return index >= N; 
} 

template<> 
bool GreaterThanOrEqual<0l>(size_t index) 
{ 
    return true; 
} 

Vì vậy, bây giờ, lớp trông giống như:

template<size_t N, typename T> 
class Int 
{ 
    bool valid(size_t index) { return GreaterThanOrEqual<N>(index); } 
    T t; 
} 

Tất nhiên, tôi nhận được cảnh báo tham số không sử dụng, nhưng có nhiều cách xung quanh đó ....

Đây có phải là một giải pháp hợp lý không ution?

+0

Vâng, tôi muốn nói là vậy. – villintehaspam

1

Bạn có thể chuyên int cho N = 0.

+0

Tôi đã cố gắng thực hiện việc này, nhưng tôi không nghĩ bạn có thể chuyên về một phần chức năng với thông số mẫu không phải kiểu. Bạn có biết cách thực hiện điều này không? – JaredC

+0

mẫu lớp Int <0, T> {...} – templatetypedef

+0

Cảm ơn Lớp này thực sự phức tạp hơn sau đó là ví dụ đơn giản của tôi, vì vậy, việc chuyên môn cho cả lớp không phải là một lựa chọn. Có cách nào để chỉ chuyên chức năng hợp lệ()? – JaredC

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