Рекурсивный push_back не работает на пользовательском классе - PullRequest
2 голосов
/ 27 ноября 2011

Я уверен, что его задавали 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 ]

3 голосов
/ 27 ноября 2011

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

0 голосов
/ 27 ноября 2011

Решение

На основании этих ответов и моего другого вопроса здесь:

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

Решение, необходимое для изменения 3 вещей:

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

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

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