C ++找不到方法(boost signals2)

时间:2015-11-10 21:40:53

标签: c++ c++11 boost

这是代码,c ++ 11:

#include <string>
#include <boost/signals2/signal.hpp>

namespace messages {
    struct Event1 final {};
    struct Event2 final {};

    template <typename T, typename Tag>
    class EventHandler {
    protected:
        bool cache_valid_ = false;
        T cache_val_;
        boost::signals2::signal<void (const T&)> signal_;
        using slot_type = typename decltype(signal_)::slot_type;
        using connection = boost::signals2::connection;
    public:
        EventHandler() {}
        void emit(Tag, const T& val) {
            if (val != cache_val_) {
                cache_valid_ = true;
                cache_val_ = val;
                signal_(val);
            }
        }

        connection subscribe(Tag, slot_type slot) {
            if (cache_valid_)
                slot(cache_val_);
            return signal_.connect(slot);
        }
    };
}

struct MessageBus : public messages::EventHandler<int, messages::Event1>,
            public messages::EventHandler<std::string, messages::Event2> {
};

int main()
{
    MessageBus bus;
    bus.subscribe(messages::Event1(), [](const int& val) {});
}

最新版本的gcc和clang无法使用-std=c++11编译此代码,他们无法决定在此处选择哪种重载:bus.subscribe(messages::Event1(), [](const int& val) {});

1)为什么,他们不能选择合适的方法?只有一个MessageBus::subscribe,它接受​​Event1类型作为第一个参数

2)如何修复此问题,而不进行MessageBus修改?

我可以通过以下代码修复此问题:

struct MessageBus : public messages::EventHandler<int, messages::Event1>,
            public messages::EventHandler<std::string, messages::Event2> {
    using messages::EventHandler<int, messages::Event1>::subscribe;
    using messages::EventHandler<std::string, messages::Event2>::subscribe;
};

messages::EventHandler背后的整个想法是为了减少引入新邮件的工作,因此最好通过某种方式修改messages::EventHandler来解决此问题。

0 个答案:

没有答案