C ++ / CLI - неоднозначный символ пространства имен и класса

Я пытаюсь скомпилировать файл C ++ / CLI, который включает файл заголовка (собственный, сторонний), в котором определен класс «Foo». Кроме того, я использую библиотеку C # через # using "Bar.dll", в которой определено пространство имен "Foo". Компилятор выдает ошибку C2872 «Foo - неоднозначный символ».

Я не знаю, в каком пространстве имен определен собственный класс «Foo», поскольку определение класса в файле заголовка не вложено в определенное пространство имен. Поэтому я предполагаю, что класс «Foo» может не находиться в пространстве имен (это возможно в C ++, не так ли?). В противном случае я бы указал класс «Foo» с его пространством имен, чтобы сделать его специфичным для компилятора.

У меня есть возможность переименовать пространство имен «Foo», используемое в «Bar.dll», но я ищу другое решение для сохранения пространства имен. На самом деле класс и пространство имен - это разные элементы, но не для компилятора c ++ / cli, я думаю?

Спасибо заранее, Мичбек


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

В дополнение к определению типа для класса «Foo» (любезно предоставлено Дэвидом Яу) проблема может быть решена путем использования глобального пространства имен для класса «Foo»: :: Foo. Таким образом, компилятор может различать этот класс и пространство имен «Foo» в «Bar.dll».

person Michbeckable    schedule 30.03.2011