Проблема приведения в C ++ / CLI - не компилируется - PullRequest
0 голосов
/ 25 июля 2011

У меня есть следующее в C ++ / CLI: (обратите внимание на мои ошибки в комментариях)

class Base{...}   

class Derived : public Base{...}

public ref class CliClass
{
    public:
    std::list<Base*> *myList;

    CliClass()
    {
    myList = new list<Base*>();
    }

    AddToList(Derived *derived)
    {
        myList->push_back(derived);
    }

    DoCast()
    {
        Derived *d = nullptr;

        int n = (int)myList->size();
        for(int i = 0; i < n; i++)
        {

        //this following does not compile
        //error C2440: 'type cast' : cannot convert from 'std::list<_Ty>' to 'Derived *'

        d = (Derived*)myList[i];    

        //I've also tried this -which does not compile
        //error C2682: cannot use 'dynamic_cast' to convert from 'std::list<_Ty>' to 'Derived *'

        d = dynamic_cast<Derived*>(myList[i]);


        }
    }
}

Я хотел бы привести myList [i] к типу Derived .. но он не будетпозвольте мне.

Любые предложения о том, как правильно разыграть это?(компилируется и является безопасным во время выполнения - т.е. не взорвется при неправильном наборе)

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Вы все неправильно поняли.Предполагая, что в вашем коде есть несколько опечаток, и вы имеете в виду std::list, вы говорите:

std::list<Base*> * myList;

/* ... */

myList[i] = /* ... */ ;

В последней строке myList рассматривается как массив списков , которыйникогда не создан!Доступ к элементам списка осуществляется путем итерации.

Вот переписывание скелета, надеюсь, вы сможете извлечь из него исправления:

public ref class CliClass
{
public:
  std::list<Base*> * myList;

  CliClass() : myList(new std::list<Base*>()) { }

  DoCast()
  {
    for(auto it = myList->cbegin(), end = myList->cend(); it != end; ++it)
    {
      Derived * const d = dynamic_cast<Derived*>(*it);
      /* do something useful with d */
    }
  }
};
0 голосов
/ 25 июля 2011

C ++ в std :: list не имеет оператора [].
Кроме того, это std :: list и НЕ std: List .

Таким образом, код, вероятно, пытается преобразовать список в Производное * и затем, вероятно, попытается использовать оператор [] для результата.

Так что просто найдите другой способ хранения данных (например, std::map<int,Base*>).

Примерно так:

std::for_each(myList.begin(), myList.end(), DoSomething);

void DoSomething(Base* item)
{
   Derived* d = dynamic_cast<Derived*>(item);

}

Или прямой подход (если у вас нет правильных макросов):

for (std::vector<Base*>::iterator item = myList.begin(); item  != myList.end(); ++item ) { //Iterate through 'myList'
   Derived* d = dynamic_cast<Derived*>(*item );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...