有没有办法让插槽连接信号?即,我想将信号的时隙从一个类的一个实例复制到另一个
我班上有一个信号,遇到以下错误。这可能是因为这个类在STL容器中使用。
1>c:\boost_1_52_0\boost\signals\detail\signal_base.hpp(150): error C2248: 'boost::noncopyable_::noncopyable::noncopyable' : cannot access private member declared in class 'boost::noncopyable_::noncopyable'
1> c:\boost_1_52_0\boost\noncopyable.hpp(27) : see declaration of 'boost::noncopyable_::noncopyable::noncopyable'
1> c:\boost_1_52_0\boost\noncopyable.hpp(22) : see declaration of 'boost::noncopyable_::noncopyable'
1> This diagnostic occurred in the compiler generated function 'boost::signals::detail::signal_base::signal_base(const boost::signals::detail::signal_base &)'
1> test.cpp
所以,我决定放一个复制构造函数并将信号连接到参数信号的插槽,然后我得到以下错误,
1>d:\workarea\boostsignalsEx\test.h(26): error C2663: 'boost::signal1<R,T1>::connect' : 2 overloads have no legal conversion for 'this' pointer
1> with
1> [
1> R=void,
1> T1=int
1> ]
如果我删除了复制构造函数参数的const限定符,我会收到另一个错误..
1>d:\workarea\boostsignalsEx\test.h(40): error C2558: class 'test' : no copy constructor available or copy constructor is declared 'explicit'
这是我正在处理的示例代码
class test{
public:
boost::signal1<void, int> sig;
test(const test& t) { t.sig.connect(sig);};
void attach(boost::function1<void, int> f) {sig.connect(f);}
};
猜测链接信号是行不通的,因为我不确定复制构造函数参数对象是否会出现“this”对象
答案 0 :(得分:3)
您只需将信号连接到新目标:
#include <boost/signals2.hpp>
typedef void(Sigature)(int);
typedef boost::signals2::signal<Sigature> Signal;
typedef Signal::slot_type SlotType;
class test{
public:
Signal sig;
test() = default;
test(const test& other) { *this = other; };
test& operator=(test const& other) { sig.connect(other.sig); return *this; }
void attach(SlotType const& f) { sig.connect(f); }
void trigger(int i) const { sig(i); }
};
int main()
{
test a, b;
a.attach([](int i) { std::cout << "subscribed to a: " << i << "\n"; });
a.attach([](int i) { std::cout << "also subscribed to a: " << i << "\n"; });
std::cout << "Trigger via a:\n";
a.trigger(42);
b = a;
std::cout << "\nNow via b:\n";
b.trigger(43);
}
打印
Trigger via a:
subscribed to a: 42
also subscribed to a: 42
Now via b:
subscribed to a: 43
also subscribed to a: 43
答案 1 :(得分:1)
Boost信号在设计上是不可复制的,因此不能在STL容器中使用。可以使用指向信号的指针,如Blog中所述。
信号可以移动,可以在c ++ 11容器中使用。