2011-01-01 46 views
5

Tôi đang sử dụng mẫu chức năng:uint8_t và unsigned char liên kết lỗi

template<typename T> void func(const T& value) 
{ 
    obj->func(value); 
} 

nơi obj là đối tượng của lớp:

void my_object::func(int64_t value) { ... } 
void my_object::func(uint64_t value) { ... } 
void my_object::func(uint32_t value) { ... } 
void my_object::func(uint16_t value) { ... } 
void my_object::func(uint8_t value) { ... } 

Vấn đề là với uint8_t quá tải của my_object :: func() ghi đè. Trình liên kết phàn nàn về các biểu tượng bên ngoài chưa được giải quyết để quá tải, trong đó phảithông số char unsigned char.

Tôi có nên thay thế uint8_t quá tải với quá tải char quá tải không?

Chỉnh sửa: Vừa được chú ý, người liên kết đó phàn nàn về số uint64_tint64_t.

Tôi biên dịch trên Windows bằng cách sử dụng MSVC++ 2008 Express.

Edit: Xin lỗi, tôi tuyên bốmy_object :: func (uint8_t value) chức năng (và khác), nhưng tôi không định nghĩa nó.

+0

Ngẫu nhiên, trình biên dịch của bạn là gì? –

+0

MSVC++ 2008 Express – mnn

+1

Thông báo lỗi ** chính xác ** bạn nhận được là gì? –

Trả lời

0

Tôi đoán rằng uint8_t đã được typedef được chỉnh sửa thành unsigned char, do đó lý do bạn thấy điều đó.

+0

Nhìn vào nguồn, không. uint8_t là typedef cho UINT8. – mnn

+0

hm .. Tôi không chắc chắn nhưng 'uint8_t' thuộc về' stdint.h' mà mục đích là trừu tượng ra khỏi các kiểu nguyên thủy mà lần lượt có thể khác nhau trong các nền tảng khác nhau. – Muggen

+0

Thư viện tôi đang làm việc có chứa tệp, phân biệt giữa môi trường xây dựng. Nếu nó là cửa sổ, nó định nghĩa tất cả các loại int bằng tay, nếu Linux nó bao gồm stdint.h và inttypes.h – mnn

8

Đây là tập tin include nên #include để sử dụng các loại nêu trên (khuyến nghị C99)

#include <stdint.h>

+1

Làm thế nào điều đó dẫn đến * liên kết * lỗi? –

+0

Không, tôi đang xây dựng trên Windows. – mnn

+0

Nó dẫn đến * liên kết * lỗi vì bao gồm bạn phải '# include' sẽ không được chuyển đổi trước khi biên dịch thông qua khai báo' typedef' tất cả int32 ... Nói cách khác, trong quá trình biên dịch tất cả các loại đặc biệt được đề cập ở trên không tồn tại nữa - do đó chúng không có trong * liên kết *. –

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