2016-05-04 2 views
0

Я новичок в C++ и reying для использования шаблонов. У меня есть функция, которая может получить некоторые типы.C++ - ошибка при попытке использовать шаблон

Заголовок:

template <typname T> 
response_t send_sequence_to_device(map<const string_t, T*> msg2device_p, 
    vector<response_t>& result_list, ushort num_attempts=SEND_NUM_ATTEMPTS); 

Источник:

template <typname T> 
response_t send_sequence_to_device(map<const string_t, T*> msg2device_p, 
    vector<response_t>& result_list, ushort num_attempts) 
{ 
    bool is_ok_flag = true; 
    response_t r; 
    raftor1_logs_t* rlogs; 
    map<const string_t, T*>::iterator msg_it; 
    for(msg_it=msg2device_p.begin(); msg_it!=msg2device_p.end() and is_ok_flag; msg_it++) 
    { 
     r = msg_it->second->send(msg_it->first, true, num_attempts); 
     result_list.push_back(r); 
     is_ok_flag = is_ok_flag and is_ok(r); 

     if(not(is_ok_flag)) 
     { 
      stringstream ss; 
      ss << "ALERT: Sequence aborted due to error on message [" << msg_it->first << "] "; 
      if(r.erred()) 
       ss << "due to communication failure."; 
      else 
       ss << "with error message [" << r.msg << "]."; 
      rlogs->alert.begin_record(); 
      rlogs->alert.write(ss.str()); 
      rlogs->alert.end_record(); 
     } 
    } 

    if(is_ok_flag) 
     r.set_ok("ok.\n"); 

    return r; 
} 

Я получаю следующее сообщение об ошибке:

device_manager.cpp|1076|error: need 'typename' before 'std::map, T*>::iterator' because 'std::map, T*>' is a dependent scope

+1

Предполагая, что из этого прототипа видны адекватные typedefs, это выглядит нормально. Отправьте полный фрагмент кода, который производит эту ошибку. – Quentin

+0

@ Quentin - это соответствующий код в заголовке. Вам нужен код из Источника? – Sarit8

+1

У вас есть 'template ' в источнике? – vu1p3n0x

ответ

0

Здесь:

map<const string_t, T*>::iterator msg_it; 

Вам необходимо:

typename map<const string_t, T*>::iterator msg_it; 
+0

Я также могу прочитать ошибку :) Но зачем мне нужно имя типа и почему только в источнике? – Sarit8

+0

Вам нужно 'typename', потому что компилятор не может знать заранее, если карта :: iterator - это тип или значение. C++ требует, чтобы в таких случаях компилятор предполагал, что это значение, если вы явно не говорите, что это имя. И почему в этом случае, ну, это потому, что он имеет форму klass :: type, где T - аргумент шаблона в охватывающей области. –

+0

, но почему я не должен писать, также находится в файле heder? – Sarit8

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