C++/CLI странная проблема наследования

У меня есть 3 класса в моем проекте (назовем тогда A, B и C). A является абстрактным. Они имеют следующую взаимосвязь:
A — базовый класс B
B — базовый класс C.

И внутри C я объявляю переменную vector<A*> member_vector;. Это вызывает следующие проблемы:

C3699: '*': нельзя использовать эту косвенность для типа 'A'
C4368: невозможно определить 'member_vector' как элемент управляемого 'C': смешанные типы не поддерживаются.

Есть ли у вас какие-либо подсказки, почему эта ошибка происходит? Я думаю, что может быть проблема с использованием циклического класса, однако, как я могу ее преодолеть?


person jpnavarini    schedule 17.06.2011    source источник
comment
Вместо того, чтобы пытаться описать свой код, почему бы вам просто не опубликовать репрезентативный пример? И где использование циклического класса?   -  person Oliver Charlesworth    schedule 18.06.2011
comment
Здесь определенно происходит что-то еще, так как это ошибка C++/CLI. Пожалуйста, отправьте код и детали вашего проекта.   -  person Adam Maras    schedule 18.06.2011
comment
Вы упустили важную деталь — вы компилируете с помощью /clr, а ваши 3 класса являются управляемыми типами.   -  person ildjarn    schedule 18.06.2011
comment
Вы используете C++/CLI? Почему упоминается управляемый объект?   -  person Jason    schedule 18.06.2011


Ответы (2)


Проблема в том, что вы пытаетесь использовать собственный тип std::vector внутри управляемого класса .NET Framework в C++/CLI. Если вы не знаете C++ и .NET, то C++/CLI не рекомендуется.

person Puppy    schedule 17.06.2011
comment
Я не понимаю вашей точки зрения. Я использую Visual С++. И я уже использовал std::vector в других программах, и все работало нормально. - person jpnavarini; 18.06.2011
comment
@jpnavarini: Visual C++ — это компилятор, а не язык. Язык, который вы используете, — это C++/CLI, который может использовать std::vector<>, но не в том контексте, в котором вы пытаетесь его использовать. Возможно, вы все равно захотите использовать C++. - person ildjarn; 18.06.2011
comment
@ildjarn Мне нужно создать вектор одного класса в другом классе, возможно ли это в C++/CLI? Кроме того, я думаю, что уже делал подобные вещи в других проектах C++/CLI. - person jpnavarini; 18.06.2011
comment
@jpnavarini: вектор - это гораздо больше концепция C++, чем концепция C++/CLI. Идиоматический код C++/CLI будет использовать System::Collections::Generic::List<T>, а не std::vector<T>. Прежде чем комментировать дальше, вам необходимо понять разницу между Visual C++, C++ и C++/CLI. - person ildjarn; 18.06.2011

У вас есть две проблемы. Во-первых, вы используете собственный тип в своем классе, который является управляемым классом (C4368). Кроме того, вам нужно использовать «^» вместо «*», учитывая, что это управляемо (C3699).

person bradenb    schedule 17.06.2011
comment
@jpnavarini: вы используете C++/CLI, а не C++ - совершенно разные языки. Если вы хотите использовать C++, используйте один из шаблонов проектов Win32, а не один из шаблонов проектов CLR. - person ildjarn; 18.06.2011
comment
@ildjarn был прав. Хотя C++/CLI очень похож, это не C++, и * не используется таким же образом. - person bradenb; 18.06.2011
comment
Я знаю, что использую Visual C++. Я просто не знаю, в чем разница между * и ^ в Visual C++. - person jpnavarini; 18.06.2011
comment
@jpnavarini см., например, functionx.com/cppcli/index.htm и, более конкретно, functionx.com/cppcli/handles/Lesson04b.htm - person jonsca; 18.06.2011
comment
@jpnavarini: никто не указал, что вы используете Visual C++, они указали, что вы используете C++/CLI. - person ildjarn; 18.06.2011