Как справиться с конфликтом имен классов при переносе старого кода? - PullRequest
5 голосов
/ 10 октября 2008

Я пытаюсь портировать старую библиотеку (которая, насколько я могу судить, не использует пространства имен) на современные компиляторы. Одна из моих целей не может определить разницу между System :: TObject и :: TObject (без пространства имен). System :: TObject является родной для компилятора.

Я пробовал директиву using, то есть using :: TObject;

Но это не так.

Очевидное решение состоит в том, чтобы обернуть всю исходную библиотеку в пространство имен и затем назвать ее по имени, что должно избежать двусмысленности. Но это ли самое мудрое решение? Есть ли другое решение? Добавление пространства имен потребовало бы изменения группы файлов, и я не знаю, будет ли это иметь нежелательные последствия позже.

Ответы [ 5 ]

3 голосов
/ 10 октября 2008

Вы можете сделать, как предложил Dib, с небольшой модификацией:

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

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

#ifndef DONT_AUTO_INCLUDE_OLD_NAMESPACE
using namespace oldlib;
#endif

Это позволяет вам # определять исключение только в тех файлах, в которых возникают конфликты, и в противном случае использовать все символы в качестве глобальных символов.

1 голос
/ 10 октября 2008

Вы можете создать оболочку для всех старых функций и упаковать их в DLL или статическую библиотеку.

0 голосов
/ 10 октября 2008

В прошлом я использовал следующее при инкапсуляции стороннего заголовочного файла, содержащего классы, конфликтующие с кодом:

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

Таким образом, «Символ» в заголовке был префиксом ThirdParty, и это не противоречило моему коду.

0 голосов
/ 10 октября 2008

Попробуйте это:

namespace oldlib
{
   #inclcude "oldlib.h"
};
0 голосов
/ 10 октября 2008

Если у вас есть источник для библиотеки, возможно, включите файл заголовка вверху каждого источника, где этот файл заголовка имеет только:

#define TObject TMadeUpNameObject
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...