C++ 如何使一个类有两个名称?

C++ 如何使一个类有两个名称?,c++,C++,我使用的库在平台/版本之间只有一个区别。一个版本调用类btCollisionObject,其他版本调用它btCollisionObjectWrapper。如果我能让这个类有两个仍然引用该类的名称,那么我所有的问题都会得到解决。我试过:#定义btCollisionObject btCollisionObjectWrapper但它不工作。定义类之后,给类取两个名称的正确方法是什么 typedef btCollisionObjectWrapper btCollisionObject; 最好使用语言工

我使用的库在平台/版本之间只有一个区别。一个版本调用类btCollisionObject,其他版本调用它btCollisionObjectWrapper。如果我能让这个类有两个仍然引用该类的名称,那么我所有的问题都会得到解决。我试过:
#定义btCollisionObject btCollisionObjectWrapper但它不工作。定义类之后,给类取两个名称的正确方法是什么

typedef btCollisionObjectWrapper btCollisionObject;

最好使用语言工具,而不是预处理器。

如果我正确理解了您的问题,您将必须找到一种方法来确定您为哪个平台编译,因为我不知道您使用的是哪个平台,我无法就此给出任何建议,但可能通过宏来实现

您的问题的解决方案可能看起来有点像这样

在C++98中使用类型声明

#ifdef __PLATFORM_SPECIFIC_DEFINE
    typedef btCollisionObjectWrapper btCollisionObject;
#endif
在使用别名声明的C++11中,这有一个额外的优点,即它们可以与模板一起使用,但是在您的情况下,您可以使用简单的typedef

#ifdef __PLATFORM_SPECIFIC_DEFINE
    using btCollisionObject = btCollisionObjectWrapper;
#endif
这将允许您使用
btCollisionObject
作为使用
btCollisionObjectWrapper


当然,您必须将
\u平台特定的\u DEFINE
替换为使用
btCollisionObjectWrapper

的平台定义的宏,这可能是因为您的#DEFINE中有一个分号,而该分号(很可能)不应该存在?错误C2371:“btCollisionObjectWrapper”:重新定义;不同基础types@SteveDeFacto为什么要同时使用库的两个版本?@SteveDeFacto:我想你是想用另一种方式来做的?@sftrabbit我没有同时使用同一个库的两个版本,但我认为它也定义了btCollisionObject,但在这个版本中有所不同。我将尝试创建第三个类,并使用ifdef来确定定义了哪个类。不管怎样,K-Balo的答案都是解决方法。@莱梅斯:从技术上讲,它不是C语言和C++语言的一部分。这就是为什么它是一个预处理器…类型别名还有更像C++的优点,因为它们强调类型,而不是像C声明语法强调表达式那样强调表达式。我想知道
typedef
和使用
语句的
之间到底有什么区别。你能给我指一个网站/什么的吗,这解释了区别?谷歌搜索表达式也可以得到正确的结果。我并不是百分之百地理解所有的差异,因为我自己还没有真正研究过,在我第一次学习
别名声明时提到的唯一区别是,在创建模板别名时可以使用它。@ctor我想我已经了解了。不过,我想我明天还得再看看这个“在模板中使用”对我来说似乎有点错误。我想你应该说“可以用于模板类型”。但正如我所说,在认真评论之前,我必须再看一眼。我的意思是,如果我想将
std::vector
别名为
v
,我不能使用
typedef vector v
。但是,我可以使用v=vector使用
模板。