C++/CLI - Двусмислен символ на пространство от имена и клас

Опитвам се да компилирам C++/CLI файл, който включва заглавен файл (роден, на трета страна), където е дефиниран клас "Foo". Освен това използвам C# dll чрез #using "Bar.dll", където е дефинирано пространство от имена "Foo". Компилаторът дава грешка C2872 „Foo е двусмислен символ“.

Не знам в кое пространство от имена е дефиниран родният клас "Foo", тъй като дефиницията на класа в заглавния файл не е вложена в определено пространство от имена. Така че предполагам, че класът "Foo" може да не е в пространство от имена (това е възможно в C++, нали?). В противен случай бих посочил класа "Foo" с неговото пространство от имена, за да го направя специфичен за компилатора.

Имам възможност да преименувам пространството от имена "Foo", използвано в "Bar.dll", но търся различно решение, за да запазя пространството от имена. Всъщност класът и пространството от имена са различни елементи - но не и за c++/cli компилатора, предполагам?

Thx предварително Michbeck


person Michbeckable    schedule 28.03.2011    source източник


Отговори (3)


Не съм сигурен дали това ще проработи, но си струва да опитате.

namespace FooNamespace = Foo;
typedef Foo FooClass;

Директивата за пространство от имена е валидна само за пространства от имена, а не за класове. Обратно с typedef. Трябва да можете да използвате FooClass и FooNamespace във вашия код.

person David Yaw    schedule 29.03.2011

Сблъсквал съм се с подобен проблем с огромна патентована кодова база, която би била твърде скъпа за промяна. Проблемът изглежда изскача за мен, когато опитам следното:

using namespace System;

Кодът, който включвам, случайно има свой собствен клас Enum и ако започнете да използвате пространството от имена „System“, тогава двете имена се сблъскват. За да реша това, просто поставям това вътре в заглавието на пространството от имена { }.

namespace MyNamespace
{
    using namespace System;

    ...
}

Това може да не работи за директивата #using, но може да си струва да опитате.

#using "Bar.dll"

namespace MyNamespace
{

    using namespace System;
    using namespace Foo;

    ...
}
person havocheavy    schedule 29.03.2011

В допълнение към typedef за класа "Foo" (с любезното съдействие на David Yaw) проблемът може да бъде решен чрез използване на глобалното пространство от имена за класа "Foo": ::Foo. Така че компилаторът може да направи разлика между този клас и пространството от имена "Foo" в "Bar.dll"

person Michbeckable    schedule 30.03.2011