【问题标题】:Why won't std::bind compile when bound to a member function? [duplicate]为什么 std::bind 绑定到成员函数时不会编译? [复制]
【发布时间】:2018-06-18 10:16:34
【问题描述】:

我目前正在开发一个需要使用 std::bind 将参数绑定到成员函数的程序,但是当我尝试这样做时,出现编译器错误。下面是一个最小的例子:

地图.h:

#pragma once

class Map {
    void buildDistances();
    void buildDistances(unsigned islandId);

};

Map.cpp:

#include "Map.h"

#include <functional>

void Map::buildDistances() {
    for(unsigned islandId=0;islandId<24;++islandId){
        auto f = std::bind(&Map::buildDistances, this, islandId);
    f();
    }
}

void Map::buildDistances(unsigned islandId) {}

在与这两个文件相同的目录中使用命令g++ Map.cpp -c -o map.o 编译会产生以下错误:

Map.cpp: In member function ‘void Map::buildDistances()’:
Map.cpp:7:64: error: no matching function for call to ‘bind(<unresolved overloaded function type>, Map*, unsigned int&)’
         auto f = std::bind(&Map::buildDistances, this, islandId);
                                                                ^
In file included from Map.cpp:3:
/usr/include/c++/8.1.1/functional:808:5: note: candidate: ‘template<class _Func, class ... _BoundArgs> typename std::_Bind_helper<std::__is_socketlike<_Func>::value, _Func, _BoundArgs ...>::type std::bind(_Func&&, _BoundArgs&& ...)’
     bind(_Func&& __f, _BoundArgs&&... __args)
     ^~~~
/usr/include/c++/8.1.1/functional:808:5: note:   template argument deduction/substitution failed:
Map.cpp:7:64: note:   couldn't deduce template parameter ‘_Func’
         auto f = std::bind(&Map::buildDistances, this, islandId);
                                                                ^
In file included from Map.cpp:3:
/usr/include/c++/8.1.1/functional:832:5: note: candidate: ‘template<class _Result, class _Func, class ... _BoundArgs> typename std::_Bindres_helper<_Result, _Func, _BoundArgs>::type std::bind(_Func&&, _BoundArgs&& ...)’
     bind(_Func&& __f, _BoundArgs&&... __args)
     ^~~~
/usr/include/c++/8.1.1/functional:832:5: note:   template argument deduction/substitution failed:
Map.cpp:7:64: note:   couldn't deduce template parameter ‘_Result’
         auto f = std::bind(&Map::buildDistances, this, islandId);

为什么会发生这种情况,我该如何解决?我试图通过将部分错误放入搜索引擎来查找结果,但没有找到任何有用的结果。我也试过用 clang 编译,同样的错误。

【问题讨论】:

标签: c++ c++11 stdbind


【解决方案1】:

这是因为您重载了函数,而std::bind 不知道函数签名,因此无法区分它们。

简单的解决方案?重命名函数。

不太简单的解决方案:将指向函数的指针转换为正确的类型。

【讨论】:

  • 更简单:使用 lambda。
猜你喜欢
  • 1970-01-01
  • 2015-07-14
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多