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
}
Nguồn
2009-03-14 03:21:11
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 –