c++ 重载函数疑难解答:<未解析的重载函数类型>

c++ Trouble casting overloaded function: <unresolved overloaded function type>

本文关键字:函数 重载 类型 gt lt 疑难解答 c++      更新时间:2023-10-16

我有一个超类中的函数,设计用于将字符串与内部函数关联:

class Base
{
    typedef std::function<void(double)> double_v;
    bool registerInput(std::string const& key, double_v const& input) {
        functions[key] = input;
    }
    void setInput(std::string key, double value) {
        auto fit = functions.find(key);
        if (fit == functions.end()) return;
        fit->second(value);
    }
    std::map<std::string, double_v> functions;
}

这个想法是,我可以注册函数的任何子类都可以用字符串和值调用它们:

SubBase::SubBase() : Base(){
    Base::registerInput(
        "Height", 
        static_cast<void (*)(double)>(&SubBase::setHeight)
    );
}
void SubBase::setHeight(double h) {
....
}

然后可以称为:

subBaseInstance.setInput("Height", 2.0);

然而,当我编译时,我得到了以下错误:

In constructor ‘SubBase::SubBase()’
error: invalid static_cast from type ‘<unresolved overloaded function type>’ to type ‘void (*)(double)’

我错过了什么?

正如其他人所指出的,类型不匹配。但是,您可以使用std::bind使其工作:

Base::registerInput(
    "Height", 
    std::bind(&SubBase::setHeight, *this, std::placeholders::_1)
);

SubBase不是static,因此它有一个隐含的SubBase*(您为其调用成员函数的对象)的第一个参数。因此签名是void (*) (SubBase*, double)。在C++11中,您可能(我不完全确定)将它转换为function<void (SubBase*, double)>

使用lambda函数,可以执行以下操作:

SubBase::SubBase() : Base(){
    auto myself = this;
    Base::registerInput( 
        "Height",  
        [myself] (double v) { myself->setHeight (v); }
    ); 
} 
void SubBase::setHeight(double h) { 
.... 
} 
typedef std::function<void(double)> double_v;

function-pointer

static_cast<void (*)(double)>(&SubBase::setHeight)

member-function pointer。它们不能相互转换。

您可以将std::bind用于此

SubBase::SubBase() : Base(){
    Base::registerInput(
        "Height", 
        std::bind(&SubBase::setHeight, this, std::placeholders::_1)
    );