C+/Boost - Signals2 无法绑定具有 1 个参数的插槽

问题描述 投票:0回答:1

我有这个代码:

namespace VE
{
    template<typename Func>
    using VESignal = boost::signals2::signal<Func>;
}
class NodeManager {
public:
    static VE::VESignal<void(int guid)> NodeDestroyed;
}

这段代码:

class  Map : public VE::Nodes::VENode
{
public:
    explicit Map(VE::Nodes::VEId veid);
    virtual ~Map();
    void Initialize() override;
    void RemovePlayer(int guid);
}

比我这样做:

void Map::Initialize()
{
    NodeManager::NodeDestroyed.connect(boost::bind(&Map::RemovePlayer, this, _1));
}

但这并不允许我这样做。给我错误:

In template: no matching function for call to object of type 'boost::_mfi::mf1<void, Map, int>' error occurred here in instantiation of function template specialization 'boost::_bi::list2<boost::_bi::value<Map *>, boost::_bi::value<std::_Placeholder<1>>>::operator()<boost::_mfi::mf1<void, Map, int>, boost::_bi::rrlist1<int>>' requested here

这是为什么?我该如何解决?

c++ boost
1个回答
0
投票

您正在将

std::placeholders::_1
boost::bind
混合。选择一个。

使用两者都没有问题:

住在Coliru

#include <boost/signals2.hpp>
#include <boost/bind/bind.hpp>

#ifdef USE_BOOST_BIND
using namespace boost::placeholders;
using boost::bind;
#else
using namespace std::placeholders;
using std::bind;
#endif

namespace VE {
    template <typename Func> using VESignal = boost::signals2::signal<Func>;
    namespace Nodes {
        struct VEId {
            int guid;
        };
        class VENode {
          public:
            virtual ~VENode() = default;
            virtual void Initialize() = 0;
        };
    }
}

class NodeManager {
  public:
    static VE::VESignal<void(int guid)> NodeDestroyed;
};

class Map : public VE::Nodes::VENode {
  public:
    explicit Map(VE::Nodes::VEId veid);
    virtual ~Map();
    void Initialize() override;
    void RemovePlayer(int /*guid*/) {}
};

VE::VESignal<void(int)> NodeManager::NodeDestroyed;

void Map::Initialize() { NodeManager::NodeDestroyed.connect(bind(&Map::RemovePlayer, this, _1)); }

int main() {
}

编译没有问题:

g++ -std=c++20 -O2 -Wall -pedantic -pthread main.cpp -DUSE_BOOST_BIND
g++ -std=c++20 -O2 -Wall -pedantic -pthread main.cpp
© www.soinside.com 2019 - 2024. All rights reserved.