c++如何调用一个使用模板的函数

c++ how to call a function which use template

本文关键字:函数 一个 何调用 调用 c++      更新时间:2023-10-16

我使用一个函数(calc_ts),它调用另一个包含模板的函数(send_sequence_to_device)。

send_sequence_to_device(header)的分离:

///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*>&)'|

您得到的编译错误是由于您只向一个需要3的函数提供了1个参数(其中只有1个具有默认值)。

您的函数有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参数。

在单独的头文件和源文件

中定义模板函数也可能会遇到问题

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 )
{
 .....

不幸的是,您不能真正拥有单独的模板头文件和源文件。。。不过,您可以。。。请参阅:为什么模板只能在头文件中实现?

并且您在源calc_ts中的调用站点调用函数的参数是不完整的。。。

response_t r=send_sequence_to_device(setRegMsg);  // <-- incomplete args
相关文章: