无法调用 std::function
Cannot invoke std::function
这段代码在VS2015更新1中给我错误:
错误 C2893:无法专用化函数模板"未知类型 std::invoke(_Callable &&,_Types &&...)'
#include <iostream>
#include <functional>
using std::cout;
class A
{
public:
virtual void init()
{
cout << "A";
};
};
class B
{
public:
virtual void init()
{
cout << "B";
};
};
class C : private A, private B
{
std::function<void()> a_init = &A::init;
std::function<void()> b_init = &B::init;
public:
void call()
{
a_init();
b_init();
}
};
int main()
{
C c;
c.call();
return 0;
}
如果那是 VS 编译器有问题还是我的代码,有什么想法吗?
编辑
#include "stdafx.h"
#include <functional>
class A
{
public:
virtual void inita()
{
cout << "A";
};
};
class B
{
public:
virtual void initb()
{
cout << "B";
};
};
class C : private virtual A, private virtual B
{
/*std::function<void()> a_init = &A::init;
std::function<void()> b_init = &B::init;*/
public:
void call()
{
inita();
}
};
您正在尝试将非静态成员函数分配给不带参数的std::function
。这是行不通的,因为非静态成员函数具有隐式this
参数。
如何解决这个问题取决于你想做什么。如果要在调用时提供的任意对象上调用存储函数,则需要更改std::function
签名:
std::function<void(A*)> a_init = &A::init;
void call()
{
a_init(this); // or some other object of type A on which you want to invoke it
}
[现场示例]
另一方面,如果你想在没有参数的情况下调用它,你必须在初始化时将类型为 A
的对象绑定到std::function
中:
std::function<void()> a_init = std::bind(&A::init, this);
void call()
{
a_init()
};
[现场示例]
将函数从 virtual
更改为 static
,代码将起作用。您需要类的特定实例来调用非静态函数。
另一方面,如果您希望使用非静态函数,则可以添加以下构造函数:
C(A &a, B &b)
{
a_init = std::bind(&A::init, &a);
b_init = std::bind(&B::init, &b);
}
然后在 main 中使用它,如下所示:
A a;
B b;
C c(a, b);
c.call();
编辑:
如果公共继承是可接受的选项,那么您可以更简单地做到这一点。
构造 函数:
C()
{
a_init = std::bind(&A::init, this);
b_init = std::bind(&B::init, this);
}
用法:
C c;
c.call();
相关文章:
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- Confusion: decltype vs std::function
- 为什么 std::function 可以作为 std::not2 的参数?
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 传递给std::function template的template参数究竟代表什么
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 如何在向量中删除 std::function<void()>?
- 将函数包装器转换为 std::function
- 类型擦除的std::function与虚拟函数调用的开销
- C++ std::function 对于类 exept 的所有实例都是空的(只有 Visual2019 编译器问题)
- 如果模板没有可变参数,则 Lambda 被推导出为 std::function
- 将 lambda 表达式传递给 std::function in C++
- 广义 std::function (std::any 表示可调用对象)
- std::function<std::optional<T>()> 如何与返回 T 的 lambda 兼容?
- std::function std::bind with lambda overload ambiguity
- Clang bug with std::function, std::bind and std::ref?
- 为什么我会收到编译错误"use of deleted function 'std::unique_ptr ..."
- 为什么我不能让 std::function<std::vector<T>::iterator> 绑定到返回该类型的 lambda?
- 回调(std::function/std::bind)与接口(抽象类)的优缺点