关于boost库的一段代码,有些问题不懂,来请教一下啊
template<int N>
struct Slot
{
void operator()(int x)
{
cout << "Slot current N is : " << N << endl;
}
};
template<int N>
bool operator== (const Slot<N>& a, const Slot<N>& b)
{
return true;
}
template<typename T>
class combiner
{
public:
typedef pair<T, T> result_type;
combiner(T t = T()) : v(t)
{
}
template<typename InputIterator>
result_type operator()(InputIterator begin, InputIterator end) const
{
if (begin == end)
{
return result_type();
}
vector<T> vec(begin, end);
T sum = accumulate(vec.begin(), vec.end(), v);
T max = *max_element(vec.begin(), vec.end());
return result_type(sum, max);
}
private:
T v;
};
template<typename Signature>
class SigEx
{
public:
typedef boost::signals2::signal<Signature> signal_type;
typedef typename signal_type::slot_type slot_type;
boost::signals2::connection connect(const slot_type& s)
{
return sig.connect(s);
}
boost::signals2::connection operator+=(const slot_type& s)
{
return connect(s);
}
typename signal_type::result_type operator()(typename signal_type::arg<0>::type a0)
{
return sig(a0);
}
private:
signal_type sig;
};
int _tmain(int argc, _TCHAR* argv[])
{
SigEx<void(int)> sig;
sig += Slot<10>();
sig += Slot<10>();
sig(2);
return 0;
}
typename signal_type::result_type operator()(typename signal_type::arg<0>::type a0)
[解决办法]
错误信息呢?
typename signal_type::result_type operator()(typename signal_type::arg<0>::type a0)
那你试试在 typedef boost::signals2::signal<Signature> signal_type;
这下面加一句 typedef typename signal_type::arg<0>::type arg0_type;
然后函数里面换成 arg0_type a0 看呢.
那你试试在 typedef boost::signals2::signal<Signature> signal_type;
这下面加一句 typedef typename signal_type::arg<0>::type arg0_type;
然后函数里面换成 arg0_type a0 看呢.
我刚才也试过了,还是lz的方法,加上template好使,但是不知道原理来着 哎
应该是楼上吧?lz一头雾水,毫无方法
那你试试在 typedef boost::signals2::signal<Signature> signal_type;
这下面加一句 typedef typename signal_type::arg<0>::type arg0_type;
然后函数里面换成 arg0_type a0 看呢.
我刚才也试过了,还是lz的方法,加上template好使,但是不知道原理来着 哎
应该是楼上吧?lz一头雾水,毫无方法
那你试试在 typedef boost::signals2::signal<Signature> signal_type;
这下面加一句 typedef typename signal_type::arg<0>::type arg0_type;
然后函数里面换成 arg0_type a0 看呢.
我刚才也试过了,还是lz的方法,加上template好使,但是不知道原理来着 哎
应该是楼上吧?lz一头雾水,毫无方法
嗯,我用2012试了 可以通过,但是按照int(int)就不正确啦,就像#2说的那样的,其实result_type是void
那这句又是怎么回事?SigEx<void(int)> sig;
书上是SigEx<int(int)>的
void operator()(int x)有关,你如果改成
int operator()(int x)就能和书里的一致了