2009-03-14 27 views
7

Xét đoạn mã sauLàm thế nào để viết một std :: bitset mẫu hoạt động trên 32 và 64-bit

template<unsigned int N> void foo(std::bitset<N> bs) 
{ /* whatever */ } 

int main() 
{ 
    bitset<8> bar; 
    foo(bar); 
    return 0; 
} 

g ++ phàn nàn về vấn đề này trên 64 bit vì < 8> được hiểu như là một int unsigned long , không khớp chính xác với mẫu. Nếu tôi thay đổi mẫu để nói dài int unsigned, sau đó biên dịch 32-bit phàn nàn.

Rõ ràng một cách để sửa lỗi này là thay đổi bitset < 8> để BitSet < 8ul>, nhưng là có cách nào để viết lại mẫu phần để nó sẽ làm việc với bất cứ điều gì giải thích mặc định của một số chữ là gì?

Trả lời

7

Vấn đề không phải là bạn có viết 8u hoặc 8 hay không. Vấn đề phải làm với loại tham số mẫu của mẫu chức năng của bạn. Loại của nó phải khớp với loại được sử dụng trong khai báo std::bitset. Đó là size_t theo tiêu chuẩn (phần 23.3.5)

namespace std { 
    template<size_t N> class bitset { 
    public: 
    // bit reference: 
     ... 

Trường hợp ngoại lệ là kích thước mảng, mà bạn có thể sử dụng bất kỳ loại nguyên (thậm chí bool - sau đó kích thước duy nhất có thể được chấp nhận là 1 tất nhiên):

// better size_t (non-negative), but other types work too 
template<int N> void f(char(&)[N]); 

Nhưng trong các trường hợp khác, các loại phải khớp. Lưu ý rằng điều này chỉ đúng đối với các đối số mẫu được tự động hóa, nhưng không đúng đối với các đối số được cung cấp một cách rõ ràng. Lý do là đối với những suy luận, trình biên dịch cố gắng tìm ra sự phù hợp nhất giữa các đối số mẫu thực tế và những gì nó suy ra từ lời gọi đến nó. Nhiều chuyển đổi tiềm ẩn khác không được phép sau đó. Bạn có đầy đủ các chuyển đổi có sẵn nếu bạn đặt các lập luận rõ ràng (bỏ qua các giải pháp của việc sử dụng size_t tại để làm cho quan điểm của tôi)

template<int N> void foo(std::bitset<N> bs) 
{ /* whatever */ } 

int main() { 
    bitset<8> bar; 
    foo<8>(bar); // no deduction, but full range of conversions 
} 
0

chữ số nên được hiểu là int bất kể nền tảng

+0

vấn đề nữa là tôi không thể chỉ làm cho nó mẫu vì sau đó các bitset than phiền rằng đối số của nó phải là một int không dấu –

3

Sử dụng size_t. Vì vậy, nói MSDN ít nhất.

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