首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义std::函数指针指向函数模板实例的错误,该实例是模板类的成员?

定义std::函数指针指向函数模板实例的错误,该实例是模板类的成员?
EN

Stack Overflow用户
提问于 2015-12-23 08:36:09
回答 2查看 6.6K关注 0票数 2

我得到以下错误,试图声明指向模板类成员的std::函数。

错误C2672 'std::invoke':没有找到匹配的重载函数

代码语言:javascript
复制
template <typename InputArchive, typename OutputArchive, typename ... Components>
class LevelSerializer {
...
    template <typename Component>
    void initRegistry() {
        ...
        std::function<void(entityx::Entity, OutputArchive)> f(std::bind(&LevelSerializer<InputArchive, OutputArchive, Components...>::saveComponent<Component>, this)); // errors
    }

    ...
    // I'm trying to point to an instance of this function
    template <typename T>
    void saveComponent(entityx::Entity& entity, OutputArchive& archive)
};

entityx::Entity是一个固定的(非模板)类型。为什么这样做失败了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-23 08:44:50

你有两个问题:第一,你的台词:

代码语言:javascript
复制
   std::function<void(entityx::Entity, OutputArchive)> 
       f(std::bind(&LevelSerializer<InputArchive, OutputArchive, Components...>::saveComponent<Component>, this)); // errors

应该是

代码语言:javascript
复制
   typedef std::function<void(entityx::Entity, OutputArchive) functype;
   typedef LevelSerializer<InputArchive, OutputArchive, Components...> LS;

   functype f(std::bind(&LS::saveComponent<Component>, this, 
                                          std::placeholders::_1, std::placeholders::_2 ));

您的问题是,正如您已经编写了它,您对std::bind的调用是试图返回一个没有参数的函数(并且它最终没有足够的参数用于您试图调用的成员函数)。您需要绑定place参数,以便a)成员函数有足够的参数;b)结果是有两个参数的东西。

旁白:在LevelSerializer模板中,裸LevelSerializer引用带有参数的模板。所以实际上,你只需要:

代码语言:javascript
复制
   typedef std::function<void(entityx::Entity, OutputArchive) functype;

   functype f(std::bind(&LevelSerializer::saveComponent<Component>, this, 
                                          std::placeholders::_1, std::placeholders::_2 ));

第二个问题是签名不匹配(这要感谢Piotr )。function的模板参数用于一个按值接受两个参数的函数。您的成员函数通过非const引用接受两个参数。您至少需要将模板参数更改为:

代码语言:javascript
复制
   typedef std::function<void(entityx::Entity&, OutputArchive&) functype;

   functype f(std::bind(&LevelSerializer::saveComponent<Component>, this, 
                                          std::placeholders::_1, std::placeholders::_2 ));

..。但是,您可能希望将entity参数更改为const。

票数 4
EN

Stack Overflow用户

发布于 2016-04-30 22:14:02

Martin Bonner更直接地回答了这个问题,但我想我应该注意到,在我的例子中,我收到了以下代码的错误:

代码语言:javascript
复制
std::bind(&ClassName::FuncName, objName, _1);

并按如下方式修正:

代码语言:javascript
复制
std::bind(&ClassName::FuncName, objName, std::placeholders::_1);

显然,我的一个标头包含了一个带有占位符的boost库,_1指向的是boost版本而不是我的版本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34431582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档