ошибка C3698: «CreerLevel :: Mur ^»: невозможно использовать тип аргумента коммодера de nouveau - PullRequest
2 голосов
/ 03 января 2011

У меня есть один класс, и мне нужно использовать его с вектором.

    ref class Mur
{
public:
 int debutX, debutY;
 int finX, finY;
 Mur (){}
 Mur(int debutX, int debutY) {
  this->debutX = debutX;
  this->debutY = debutY;
  finX = 0;
  finY = 0;
 }
 ~Mur()
  {
  }
 int getX() { return debutX; }
 int getY() { return debutY; }

 bool estFinit() {
  return (finX==0);
 }

 void finir(int x, int y){
  finX = x;
  finY = y;
 }
};
}

Когда я пытаюсь использовать его

 std::vector<Mur^> vMurs;
...
  vMurs.push_back(gcnew Mur(i,j));

Ошибка в файле "xmemory" в строке 52, но я не знаю этот файл xD

Ответы [ 3 ]

1 голос
/ 03 января 2011

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

Я бы настоятельно рекомендовал не использовать STL / CLR, он сочетает в себе все недостатки STL и недостатки CLR.Если вы действительно хотите использовать vector <>, то gcroot <> может решить эту проблему.Однако использование System :: Collections :: Generic :: List <> является безусловно лучшим решением.

using namespace System::Collections::Generic;
...
  List<Mur^>^ vMurs = gcnew List<Mur^>;
...
  vMurs->Add(gcnew Mur(i, j));
0 голосов
/ 03 января 2011

Попробуйте использовать

std::vector<gcroot<Mur ^> > vMurs;
...
vMurs.push_back(gcnew Mur(i,j));
0 голосов
/ 03 января 2011

Я согласен с Александром С. Если вы хотите использовать вектор, вы можете использовать вектор STL / CLR (http://msdn.microsoft.com/en-us/library/bb385954.aspx).

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