бинарный '=': не найден оператор, который принимает правый операнд типа 'gcroot <T>*' с ошибкой VS2010 - PullRequest
0 голосов
/ 29 октября 2010

Это проект приложения Windows Forms, использующий Visual Studio 2010. Как говорится:

У меня неуправляемая реализация «Вектор», что-то вроде:

template<class T>
class Vector {
public:
    T* data;
    unsigned len;

    (...constructors and operators overloading like =, [], == and !=)
};

Он отлично работает,Я сделал несколько тестов, прежде чем с ним.После этого я реализовал также неуправляемую «Матрицу», которая использует ранее класс Vector.Что-то вроде:

template<class T>
class Matrix : public Vector<Vector<T>*> {

public:
    Matrix(unsigned height = 20, unsigned width = 20) 
    : Vector(height) 
    {
    for (unsigned i = 0; i < height; i++) {
            data[i] = new Vector<T>(width);
        }
    }

    Vector<T> operator[](unsigned pos) {
        return data[pos];
    }
};

Он также отлично работает, но с неуправляемыми данными в качестве T. Моя основная задача, получить доступ к данным с помощью [] [], работала, как и ожидалось.

Но теперь я хочу использовать этот класс Matrix внутри управляемого кода, причем данные T также являются управляемым кодом, в данном случае уже реализована ячейка:

public ref class Cell {
public:
    bool dead;

public:
    Cell() {
        this->dead = false;
    }
    Cell(bool dead) {
        this->dead = dead;
    }

    virtual String^ ToString() override {
        return (this->dead ? "0" : "1");
    }
};

Я делаюинициализация следующим образом:

Matrix<gcroot<Cell^>>* cells = new Matrix<gcroot<Cell^>>(height, width);

for (unsigned i = 0; i < height; i++) {
    for (unsigned j = 0; j < width; j++) {
        gcroot<Cell^> * cell = new gcroot<Cell^>;
        cells[i][j] = cell; // ERROR!!
    }
}

Строка, в которой я назначаю ячейку матрице, всегда возвращает ошибку в заголовке.Другие операторы (кроме '=') также дают мне ту же ошибку.

Я перепробовал все, но не могу найти способ это исправить.Я действительно избегаю трогать классы Vector и Matrix, потому что они должны быть неуправляемыми, и я должен использовать gcroot для внедрения в них управляемых данных.

В конце концов Cell станет Системой:: Windows :: Forms :: Кнопка, поэтому реализация должна быть такой.

Есть идеи?Извините, если я не смог объяснить себя.Если вам нужно больше кода из класса Vector, пожалуйста, сообщите.Большое спасибо:)

1 Ответ

0 голосов
/ 29 октября 2010

Честно говоря, вам придется проделать много работы, чтобы использовать этот собственный код C ++ непосредственно из управляемого кода (если это возможно).

Вероятно, будет проще переопределить его в STL / CLR , если вам нужно придерживаться C ++, или в C #, если нет. Само существование этой библиотеки классов STL / CLR должно сказать вам кое-что о том, как целесообразно использовать native C ++ STL-контейнеры таким образом.

EDIT: Возможно, вы можете исправить ошибку компиляции, используя

template<class T> class Matrix : public Vector<Vector<T>>

Ваш operator[] не должен возвращаться по значению, иначе базовый элемент Vector не будет изменен, так как вы будете работать с копией того, что находится в Matrix.

Vector<T>& operator[](unsigned pos) {

Комментарии об этом нетривиальном стенде.

...