2012-12-22 21 views
6

プラットフォーム/バージョンの違いが1つだけあるライブラリを使用しています。あるバージョンはbtCollisionObjectクラスを呼び出し、他のバージョンはbtCollisionObjectWrapperを呼び出します。このクラスにこのクラスを参照する2つの名前を付けることができれば、すべての問題は解決されます。私は試みた:#define btCollisionObject btCollisionObjectWrapper;しかし、それは動作していません。クラスが定義された後にクラスに2つの名前を付ける正しい方法は何ですか?1つのクラスに2つの名前を付けるにはどうすればいいですか?

+9

#defineにセミコロンがある可能性があります(おそらく)そこにはないはずですか? –

答えて

11

たぶん

typedef btCollisionObjectWrapper btCollisionObject; 

より良い言語ツールの代わりに、プリプロセッサを使用して、それを行うには。

+0

エラーC2371: 'btCollisionObjectWrapper':再定義。異なる基本タイプ – SteveDeFacto

+0

@SteveDeFactoなぜあなたは同時にライブラリの両方のバージョンを使用していますか? –

+0

@SteveDeFacto:あなたはそれを他の方法でやろうと思ったのですか? –

7

私があなたの問題を正しく理解していれば、使用しているプラ​​ットフォームがわからないため、どのプラットフォームをコンパイルするのかを判断する方法を見つけなければならないでしょう。マクロを使ってそうすることができます。

問題の解決策は、おそらくこのように見えます。 C++ 98では

エイリアス宣言を使用してC++ 11に型宣言

#ifdef __PLATFORM_SPECIFIC_DEFINE 
    typedef btCollisionObjectWrapper btCollisionObject; 
#endif 

を使用し、これは彼らが自分の場合しかしテンプレートを使用することができるという追加の利点を有していますあなたは単純なtypedefを手に入れることができます。

#ifdef __PLATFORM_SPECIFIC_DEFINE 
    using btCollisionObject = btCollisionObjectWrapper; 
#endif 

これは、あなたが、もちろんbtCollisionObjectWrapperを使用して、プラットフォームによって定義されたマクロで__PLATFORM_SPECIFIC_DEFINEを交換する必要がありますbtCollisionObjectWrapper

使用するプラットフォーム用のクラス名としてbtCollisionObjectを使用できるようになります。

+1

型のエイリアスは、C宣言構文が式を強調する方法とは対照的に、型を強調する点で、より「C++のような」利点があります。 – bames53

+0

'typedef'と' using'ステートメントの違いは何ですか?違いを説明しているウェブサイト/何でも教えていただけますか?正しい結果につながるGoogleの検索式もこれを行います。 – leemes

+1

[cppreference](http://en.cppreference.com/w/cpp/language/typedef)で言及されている唯一の違いは、私が実際にそれを調べていないので、私はすべての違いについて100%私が最初に 'エイリアス宣言 'を学んだのは、テンプレートのエイリアスを作るときに使われるということです。 – ctor

関連する問題