5

古いライブラリ (私が知る限り、名前空間を使用していません) を最新のコンパイラに移植しようとしています。私のターゲットの 1 つは、System::TObject と ::TObject (ネームスペースなし) の違いを見分けることができません。System::TObject はコンパイラにネイティブです。

using ディレクティブ、つまり using ::TObject; を試しました。

しかし、それはそれをしません。

明白な解決策は、すべての元のライブラリを名前空間にラップし、名前で呼び出すことです。これにより、あいまいさを回避できます。しかし、それは最も賢明な解決策でしょうか? 他の解決策はありますか?名前空間を追加するには、一連のファイルを変更する必要があり、後で望ましくない影響があるかどうかはわかりません。

4

5 に答える 5

3

Dibが提案したように、わずかな変更を加えて行うことができます:

// In a wrapper header, eg: include_oldlib.h...

namespace oldlib
{
   #include "oldlib.h"
};

#ifndef DONT_AUTO_INCLUDE_OLD_NAMESPACE
using namespace oldlib;
#endif

これにより、競合が発生しているファイルのみで除外を定義し、それ以外の場合はすべてのシンボルをグローバル シンボルとして使用できます。

于 2008-10-10T04:57:09.830 に答える
1

すべての古い関数のラッパーを作成し、それらを DLL または静的ライブラリにパッケージ化できます。

于 2008-10-10T03:03:04.820 に答える
0

ライブラリのソースがある場合は、各ソースの先頭にヘッダー ファイルを含めることができます。そのヘッダー ファイルには次のものしかありません。

#define TObject TMadeUpNameObject
于 2008-10-10T02:44:53.780 に答える
0

コードと衝突するクラスを含むサードパーティのヘッダー ファイルをカプセル化する際に、過去に以下を使用しました。

#ifdef Symbol
#undef Symbol
#define Symbol ThirdPartySymbol
#endif
#include <third_party_header.h>
#undef Symbol

このように、ヘッダーの「シンボル」はThirdPartyによってプレフィックスされ、これは私のコードと衝突しませんでした。

于 2008-10-10T04:13:47.657 に答える
0

これを試して:

namespace oldlib
{
   #inclcude "oldlib.h"
};
于 2008-10-10T02:58:30.680 に答える