Рекурсивный 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 вещи:
- создать конструктор копирования
- перегрузить оператор [] с помощью const
- измените оператор = на const
В VS2010 ничего из этого не понадобилось, чтобы код был скомпилирован как есть. Изменение требовалось только в GCC.