2016-05-04 2 views
0

Я использую функцию (calc_ts), которая вызывает другую функцию (send_sequence_to_device), которая содержит шаблон.C++ как вызвать функцию, которая использует шаблон

decleration из send_sequence_to_device (заголовок):

///Send sequence to list of devices 
template<class T> 
    response_t send_sequence_to_device(std::map<const string_t, T*> msg2device_p,std::vector<response_t>& result_list, ushort num_attempts=SEND_NUM_ATTEMPTS); 

об осуществлении send_sequence_to_device (источник):

template<class T> 
response_t send_sequence_to_device(std::map<const string_t,T*> msg2device_p, std::vector<response_t>& result_list, ushort num_attempts) 
{ 
    bool is_ok_flag = true; 
    response_t r; 
    raftor1_logs_t* rlogs; 
    typename std::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; 
} 

Реализация calc_ts (источник)

///Calculate of the time slot 
bool link_layer_manager_t::calc_ts() 
{ 
    std::map<const string_t, lm_device_t *>setRegMsg={}; 

    if (frac_msb>51200 and frac_msb<51968) 
    { 
     setRegMsg={{"trx_set_jr_fraction ' + frac_msb +' ' + frac_lsb +'", &rx}}; 
     response_t r=send_sequence_to_device(setRegMsg); 
     return True; 
    } 
    else 
     return False; 
} 

Я получил следующая ошибка в строке response_t r=send_sequence_to_device(setRegMsg);:

error: no matching function for call to 'send_sequence_to_device(std::map<const std::basic_string<char>, lm_device_t*>&)'| 
+0

Возможный дубликат [Почему шаблоны могут быть реализованы только в файле заголовка?] (Http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header- файл) – WhiZTiM

ответ

1

Ошибка компиляции вы получите из-за вас только предоставляет 1 параметр функции, которая ожидает 3 (только один из которых имеет значение по умолчанию).

0

decleration из send_sequence_to_device (заголовок):

///Send sequence to list of devices 
template<class T> 
response_t send_sequence_to_device(std::map<const string_t, T*> msg2device_p,std::vector<response_t>& result_list, ushort 
num_attempts=SEND_NUM_ATTEMPTS); 

Реализация send_sequence_to_device (источник):

template<class T> 
response_t send_sequence_to_device(std::map<const string_t,T*> msg2device_p, std::vector<response_t>& result_list, ushort 
num_attempts) 
{ 
..... 

К сожалению, вы действительно не могут иметь отдельные файлы заголовков и исходные для шаблонов ... Вы можете хотя ... Смотрите: Why can templates only be implemented in the header file?

И ваши аргументы являются неполными для вызова функции на месте вызова в источнике calc_ts. ..

response_t r=send_sequence_to_device(setRegMsg); // <-- incomplete args 
+0

, но это то, что я сделал .... – Sarit8

0

Ваша функция имеет 3 параметра, с одним дополнительным.

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

Но вы вызываете его одним параметром, забывая параметр result_list.

Вы также можете столкнуться с проблемами при определении функции шаблона в отдельно заголовков и исходных файлов

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