boost::函数参数定义不起作用

boost::function parameter definition not working

本文关键字:不起作用 定义 函数 boost 参数      更新时间:2023-10-16

我创建了两个特殊类型,我想在应用程序中的get_property_function.hpp中使用它们:

typedef boost::function<std::string ()> GetFunction;
typedef map<std::string, GetFunction> PropertyToGetFunction;
typedef boost::function<std::string (LPARAM)> GetEventFunction;
typedef map<std::string, GetEventFunction> PropertyToGetEventFunction;

我在我的 PropertyManager.hpp 中定义了以下行:

PropertyToGetFunction create_get_map();
PropertyToGetEventFunction create_event_get_map();
PropertyToGetFunction property2getFunction;
PropertyToGetEventFunction property2getEventFunction;

我在我的物业管理器中实现它们.cpp:

PropertyToGetFunction PropertyManager::create_get_map()
{
    PropertyToGetFunction property2getFunction;

    property2getFunction[string("1.1.3.4.1.1")]=&getReceiptPrinter_DeviceCapability;
        ...
    return property2getFunction;
}
PropertyToGetEventFunction PropertyManager::create_event_get_map()
{
    PropertyToGetEventFunction property2getEventFunction;
    property2getEventFunction[string("105")]=&getPTRRetractBinThreshold_UserEvent;
        ...
    return property2getEventFunction;
}

我分配给地图的方法在 get_property_function 中定义。

get_property_function.hpp:

...
std::string getPTRRetractBinThreshold_UserEvent(LPARAM lParam);
...

get_property_function.cpp:

...
std::string getPTRRetractBinThreshold_UserEvent(LPARAM lParam)
{
    string result = "";
    //I will do some process in here and will save it in result var.
    return result;
}
...

我使用getPropertyValue在我的地图中找到正确的方法:

string PropertyManager::getPropertyValue(string property_id)
{   
    string result_value = "No Property Found";
    if (!isReadable(property_id))
    {
        return "Error";
    }
    else
    {
        PropertyToGetFunction::const_iterator it =property2getFunction.find(property_id);
        if ( it != property2getFunction.end() )
        {       
            GetFunction function = it->second;
            result_value = function();
        }
    }
    return result_value;
}
string PropertyManager::getPropertyValue(string property_id, LPARAM lParam)
{   
    string result_value = "No Property Found";
    if (!isReadable(property_id))
    {
        return "Error";
    }
    else
    {
        PropertyToGetEventFunction::const_iterator it = property2getEventFunction.find(property_id);
        if ( it != property2getEventFunction.end() )
        {       
            GetEventFunction function = it->second;
            result_value = function(lParam);
        }
    }
    return result_value;
}

getPropertyValue(string property_id)工作正常,我没有问题,但getPropertyValue(string property_id, LPARAM lParam)会导致编译错误:

1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(1144): could be 'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &,signed char *)' [found using argument-dependent lookup]
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(1146): or       'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &,signed char &)' [found using argument-dependent lookup]
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(1148): or       'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &,unsigned char *)' [found using argument-dependent lookup]
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(1150): or       'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &,unsigned char &)' [found using argument-dependent lookup]
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(155): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::basic_istream<_Elem,_Traits> &(__cdecl *)(std::basic_istream<_Elem,_Traits> &))'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(161): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::basic_ios<_Elem,_Traits> &(__cdecl *)(std::basic_ios<_Elem,_Traits> &))'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(168): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::ios_base &(__cdecl *)(std::ios_base &))'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(175): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::_Bool &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(194): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(short &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(228): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(unsigned short &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(247): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(int &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(273): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(unsigned int &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(291): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(long &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(309): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(__w64 unsigned long &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(329): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(__int64 &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(348): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(unsigned __int64 &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(367): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(float &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(386): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(double &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(404): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(long double &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(422): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(void *&)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:Program FilesMicrosoft Visual Studio 9.0VCincludeistream(441): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::basic_streambuf<_Elem,_Traits> *)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        while trying to match the argument list '(std::basic_istream<_Elem,_Traits>, LPWORD )'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        D:programmingagentcompiled4vs2008boost_v1.50.0includeboost-1_50boost/property_tree/stream_translator.hpp(35) : while compiling class template member function 'void boost::property_tree::customize_stream<Ch,Traits,E>::extract(std::basic_istream<_Elem,_Traits> &,E &)'
1>        with
1>        [
1>            Ch=char,
1>            Traits=std::char_traits<char>,
1>            E=LPWORD ,
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        D:programmingagentcompiled4vs2008boost_v1.50.0includeboost-1_50boost/property_tree/stream_translator.hpp(190) : see reference to class template instantiation 'boost::property_tree::customize_stream<Ch,Traits,E>' being compiled
1>        with
1>        [
1>            Ch=char,
1>            Traits=std::char_traits<char>,
1>            E=LPWORD 
1>        ]
1>        D:programmingagentcompiled4vs2008boost_v1.50.0includeboost-1_50boost/property_tree/stream_translator.hpp(186) : while compiling class template member function 'boost::optional<T> boost::property_tree::stream_translator<Ch,Traits,Alloc,E>::get_value(const std::basic_string<_Elem,_Traits,_Ax> &)'
1>        with
1>        [
1>            T=LPWORD ,
1>            Ch=char,
1>            Traits=std::char_traits<char>,
1>            Alloc=std::allocator<char>,
1>            E=LPWORD ,
1>            _Elem=char,
1>            _Traits=std::char_traits<char>,
1>            _Ax=std::allocator<char>
1>        ]
1>        D:programmingagentcompiled4vs2008boost_v1.50.0includeboost-1_50boost/property_tree/detail/ptree_implementation.hpp(661) : see reference to class template instantiation 'boost::property_tree::stream_translator<Ch,Traits,Alloc,E>' being compiled
1>        with
1>        [
1>            Ch=char,
1>            Traits=std::char_traits<char>,
1>            Alloc=std::allocator<char>,
1>            E=LPWORD 
1>        ]
1>        D:programmingagentcompiled4vs2008boost_v1.50.0includeboost-1_50boost/property_tree/detail/ptree_implementation.hpp(732) : see reference to function template instantiation 'Type boost::property_tree::basic_ptree<Key,Data>::get_value<Type>(void) const' being compiled
1>        with
1>        [
1>            Type=LPWORD,
1>            Key=std::string,
1>            Data=std::string
1>        ]
1>        ..............Source-CodeDevice-Managersourcepropertyget_property_functions.cpp(3328) : see reference to function template instantiation 'Type boost::property_tree::basic_ptree<Key,Data>::get<LPWORD>(const boost::property_tree::string_path<String,Translator> &) const' being compiled
1>        with
1>        [
1>            Type=LPWORD,
1>            Key=std::string,
1>            Data=std::string,
1>            String=std::string,
1>            Translator=boost::property_tree::id_translator<std::string>
1>        ]

我确定我的参数定义有问题 boost::function.你能告诉我我做错了什么吗?

在以下行中:

property2getFunction[string("105")] = &getPTRRetractBinThreshold_UserEvent

尝试将具有string(LPARAM)签名的函数分配给具有string(void)签名的boost::function(请参阅您的GetFunction类型(。这就是您收到此编译错误的原因。

您可能打算改用property2getEventFunction