Рекурсивный push_back не работает на пользовательском классе

Я уверен, что это было спрошено 100 раз, но push_back это такой популярный вопрос, что я не мог найти ответ после долгого поиска.

Моя проблема в том, что на этой странице написано, что это рекурсивный push_back должен работать без проблем на нескольких уровнях.

vector< vector<int> > vI2Matrix;    // Declare two dimensional array
vector<int> A, B;

A.push_back(10);
A.push_back(20);
A.push_back(30);
B.push_back(100);
B.push_back(200);
B.push_back(300);

vI2Matrix.push_back(A);
vI2Matrix.push_back(B);

Однако в моей версии я пытаюсь использовать пользовательский класс Vector3f вместо int, Я естественно думаю, что следующий код будет работать, но это не так. Работает на 1-м уровне, но не на 2-м.

vector< vector<Vector3f> > m;
vector<Vector3f> a;
a.push_back(Vector3f(1,2,3)); // <- 1st level works
m.push_back(a); // <- 2nd level doesn't

Код ошибки возвращается:

gobase.h:343: error: no match for ‘operator=’ in ‘* __result = * __first’
demo1.h:38: note: candidates are: Vector3f& Vector3f::operator=(Vector3f&)

Vector3f класс определяется во внешнем заголовочном файле, что я не должен изменять. Как вы думаете, что-то отсутствует в данном заголовочном файле, что делает меня неспособным использовать push_back?

В заголовочном файле определены следующие функции:

class Vector3f {
    float _item[3];

public:
    float & operator [] (int i) 
    Vector3f(float x, float y, float z) 
    Vector3f()
    Vector3f & operator = (Vector3f & obj) 
    Vector3f & operator += (Vector3f & obj) 
    bool operator ==(Vector3f & obj)
}

Обновление Вот & operator = из заголовочного файла:

Vector3f & operator = (Vector3f & obj) 
{
    _item[0] = obj[0];
    _item[1] = obj[1];
    _item[2] = obj[2];

    return *this;
};

Можете ли вы сказать мне, как я должен изменить это, чтобы сделать push_back Работа?

Посмотрите на полные шаги, необходимые для решения этой проблемы в GCC, я разместил его как дополнительный ответ.

2 ответа

Решение

Оператор присваивания отсутствует в вашем классе Vector3f. Расширению шаблона вектора push_back нужен оператор присваивания, чтобы скопировать значение в вектор, поэтому компилятор жалуется, что не может его найти. Если вы хотите изменить этот заголовок, вам также нужно будет определить Vector3f(cont Vector3f& other) Копировать конструктор.

Решение

Основываясь на этих ответах и ​​на моем другом вопросе здесь:

Как изменить данный класс для использования константных операторов

В решении требуется поменять 3 вещи:

  1. создать конструктор копирования
  2. перегрузить оператор [] с помощью const
  3. измените оператор = на const

В VS2010 ничего из этого не понадобилось, чтобы код был скомпилирован как есть. Изменение требовалось только в GCC.

Другие вопросы по тегам