2012-12-22 16 views
6

Tôi đang sử dụng thư viện chỉ có một sự khác biệt giữa các nền tảng/phiên bản. Một phiên bản gọi lớp btCollisionObject và các phiên bản khác gọi nó là btCollisionObjectWrapper. Nếu tôi có thể làm cho lớp này có hai cái tên vẫn còn tham chiếu đến lớp đó thì mọi vấn đề của tôi sẽ được giải quyết. Tôi đã thử: #define btCollisionObject btCollisionObjectWrapper; nhưng nó không hoạt động. Cách chính xác để cung cấp cho một lớp hai tên sau khi lớp đã được xác định là gì?Làm thế nào để làm cho một lớp có hai tên?

+9

Có thể là do bạn có dấu chấm phẩy trong #define của mình, trong đó (rất có thể) không nên ở đó? –

Trả lời

11

lẽ

typedef btCollisionObjectWrapper btCollisionObject; 

Tốt hơn để làm điều đó bằng các công cụ ngôn ngữ, thay vì Preprocessor.

+0

lỗi C2371: 'btCollisionObjectWrapper': định nghĩa lại; các loại cơ bản khác nhau – SteveDeFacto

+0

@SteveDeFacto Tại sao bạn sử dụng cả hai phiên bản của thư viện cùng một lúc? –

+0

@SteveDeFacto: Tôi đoán bạn có ý định làm điều đó theo cách khác? –

7

Nếu tôi hiểu vấn đề của bạn một cách chính xác, bạn sẽ phải tìm cách xác định nền tảng nào bạn đang biên dịch, vì tôi không biết bạn đang sử dụng nền tảng nào mà tôi không thể đưa ra lời khuyên nào có thể làm như vậy thông qua các macro.

Giải pháp cho vấn đề của bạn có thể sẽ giống như thế này.

Trong C++ 98 sử dụng một tuyên bố loại

#ifdef __PLATFORM_SPECIFIC_DEFINE 
    typedef btCollisionObjectWrapper btCollisionObject; 
#endif 

Trong C++ 11 sử dụng một tuyên bố alias, điều này có lợi thế nhất mà họ có thể được sử dụng với các mẫu tuy nhiên trong trường hợp của bạn bạn có thể lấy đi với một typedef đơn giản.

#ifdef __PLATFORM_SPECIFIC_DEFINE 
    using btCollisionObject = btCollisionObjectWrapper; 
#endif 

này sẽ cho phép bạn sử dụng btCollisionObject như tên lớp cho các nền tảng sử dụng btCollisionObjectWrapper

Bạn sẽ đương nhiên phải thay thế __PLATFORM_SPECIFIC_DEFINE với một vĩ mô được xác định bởi các nền tảng sử dụng btCollisionObjectWrapper.

+1

bí danh loại cũng có lợi thế là có nhiều hơn 'C++ - like' ở chỗ chúng nhấn mạnh các kiểu trái với biểu thức cách cú pháp khai báo C nhấn mạnh biểu thức. – bames53

+0

Tôi muốn biết chính xác sự khác biệt giữa câu lệnh 'typedef' và' using' là gì. Bạn có thể xin vui lòng chỉ cho tôi một trang web/bất cứ điều gì, mà giải thích sự khác biệt? Biểu thức tìm kiếm trên google dẫn đến kết quả chính xác cũng sẽ thực hiện. – leemes

+1

Tôi không phải là 100% trên tất cả các sự khác biệt vì tôi đã không thực sự nhìn vào nó bản thân mình, sự khác biệt duy nhất được đề cập trên [cppreference] (http://en.cppreference.com/w/cpp/language/typedef) nơi tôi lần đầu tiên học về 'khai báo bí danh' là nó có thể được sử dụng khi tạo một bí danh của một khuôn mẫu. – ctor

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