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

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

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

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

Спасибо заранее Michbeck

Ответы [ 3 ]

2 голосов
/ 30 марта 2011

Я не уверен, что это сработает, но стоит попробовать.

namespace FooNamespace = Foo;
typedef Foo FooClass;

Директива пространства имен действительна только для пространств имен, но не для классов. Наоборот с typedef. Вы должны иметь возможность использовать FooClass и FooNamespace в своем коде.

1 голос
/ 30 марта 2011

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

1 голос
/ 30 марта 2011

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

using namespace System;

Код, который я включаю, имеет свой собственный класс Enum, и если вы начнете использовать пространство имен "System", то эти два имени будут конфликтовать. Чтобы решить эту проблему, я просто помещаю это в заголовок пространства имен {}.

namespace MyNamespace
{
    using namespace System;

    ...
}

Это может не сработать для директивы #using, но стоит попробовать.

#using "Bar.dll"

namespace MyNamespace
{

    using namespace System;
    using namespace Foo;

    ...
}
...