Проблема правильного нажатия 2D вектора структур (C ++) - PullRequest
0 голосов
/ 07 декабря 2010

У меня проблемы с заполнением вектора типа vector<vector<clickable> >.Компилятор, кажется, будет в порядке с возвратом vector<clickable> на него, пока push_back происходит в той же функции, что и объявление переменной, но он не допускает этого, когда переменная объявлена ​​в файле .h иpush_back выполняется в другой функции класса.

В следующих примерах циклы должны быть точно такими же, за исключением того, что вызывается push_back для vector<vector<clickable> >, который был только что объявлен в той же функции, идругие вызовы push_back для одного, объявленного в файле .h.

Пример того, что работает (Это из основной функции, но работает в любой функции.):

vector<vector<clickable> > clicks;
for(int i = 0; i < 10; i++){
    vector<clickable> click;
    for(int j = 0; j < 10; j++){
            click.push_back(clickable(Rect(Point(50,50),5,10),"blar"));
    }
    clicks.push_back(click);
}

Примерчто не работает:

Gui.h:

#include <vector>
//...
struct clickable {
    Rect rect;
    string msg;
    bool visible;
    clickable(Rect rectangle, string message){
            rect = rectangle;
            msg = message;
            visible = true;
    }
};
//...
class Gui{
  public:
    //...
    void load_environment();
    //...
  private:
    vector<vector<clickable> > ship;
    //...
}

Gui.cpp:

#include "Gui.h"
//...
void Gui::load_environment(){
    for(int i = 0; i < 10; i++){
            vector<clickable> click;
            for(int j = 0; j < 10; j++){
                    click.push_back(clickable(Rect(Point(50,50),5,10),
                                            "blar"));
            }
            ship.push_back(click);
    }
}
//...

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

edit Вот текстошибка:

Gui.cpp:47: error: no matching function for call to ‘std::vector<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::allocator<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >::push_back(std::vector<clickable, std::allocator<clickable> >&)’ /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:602: note: candidates are: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Alloc = std::allocator<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

1 Ответ

2 голосов
/ 07 декабря 2010

Сообщение об ошибке в действительности говорит, что оно думает, что вектор, на который вы пытаетесь push_back, фактически vector<vector<string> >, а не vector<vector<clickable> >, как вы ожидали.

Возможно, вам просто нужно сделать чистую перестройку.

...