c++ 重载函数疑难解答:<未解析的重载函数类型>
c++ Trouble casting overloaded function: <unresolved overloaded function type>
我有一个超类中的函数,设计用于将字符串与内部函数关联:
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)
);
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载