2016-12-15 2 views
1

У меня есть msg-структура:C++ 11 не соответствующих функций для вызова «станд :: вектор

struct msg { 
    //destination port 
    int addr; 
    //data 
    unsigned long long payload; 

    //prioritized flag 
    bool isPrio; 

    //construcor? 
    msg(int a, int p, bool b) : addr(a), payload(p),isPrio(b) { } 

    msg() : addr(0), payload(0), isPrio(false) { } 

    ... 
}; 

и класс distributor, который получает msg сек через SystemC sc_in и толкают некоторые элементы 2 мерных вектор std::vector<std::vector <msg>> buffer:

class distributor: public sc_module { 
    public: 
     sc_vector<sc_in<msg>> inputMsg; 
     std::vector<std::vector <msg>> buffer; 
     int n, m, bufferSize; 
     ... 


     distributor(sc_module_name name, int n, int m, int bufferSize) : //n -> number of inputs, m -> number of outputs 
      sc_module(name), 
      inputMsg("inputMsg", n), 
      n(n), 
      m(m), 
      buffer(m), 
      bufferSize(bufferSize) 
      ... 
     { 
      SC_HAS_PROCESS(distributor); 
      SC_METHOD(receive); sensitive << ...; 
      ... 
     } 

     void receive() { 
      for(int i = 0; i < n; i++){ 
       msg newMessage = inputMsg.at(i).read(); 
       if(buffer.at(newMessage.addr).size() >= bufferSize) continue; 
       if(newMessage.isPrio) buffer.at(newMessage.addr).insert(0, newMessage); //<- ERROR OCCURS HERE 
       else buffer.at(newMessage.addr).push_back(newMessage); 
      } 
     } 

     ... 
}; 

В комментировал строке следующее сообщение об ошибке:

error: no matching function for call to ‘std::vector<msg>::insert(int, msg&)’ 
    if(newMessage.isPrio) buffer.at(newMessage.addr).insert(0, newMessage); 
                     ^

Зачем возникает ошибка?

buffer.at(newMessage.addr) является std::vector <msg> поэтому он должен принять объект типа msg, который newMessage ...

Я ценю вашу помощь!

ответ

6

std::vector::insert принимает итератор как первый аргумент, а не индекс . Вы, наверное, хотите:

void add_to_front(std::vector<msg> &vector, const msg &message) 
{ 
    vector.insert(begin(vector), message); 
} 


if(newMessage.isPrio) add_to_front(buffer.at(newMessage.addr), newMessage); 

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

Смежные вопросы