关于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)
没看到过这种用法 Boost signal
[解决办法]
错误信息呢?
typename signal_type::result_type operator()(typename signal_type::arg<0>::type a0)
返回值类型是signal_type::result_type,参数类型是signal_type::arg<0>::type的()运算符重载
[解决办法]
typename signal_type::result_type operator()(typename signal_type::arg<0>::type a0)
typename signal_type::result_type 就是 void
typename signal_type::arg<0>::type 就是 int
直接把这句改成 void operator()(int a0) 来编译试试吧.
重载了 () 操作符后它就是一个函数对象.
main 中的 sig(2); 就是在调用这个函数.
[解决办法]
楼主 boost 什么版本俄,用的啥编译器啊?我这里没有问题,boost 1.47, g++-4.4.3。用 g++-4.8 的话能看到一堆错误。另外你那个接口应该这么写。
typename signal_type::result_type operator()(typename signal_type::template arg<0>::type a0);
如果不加的话,倒是会出编译错误。
typename ... 之类的一般都是某类型的别名,这里就像楼上说的,是 void 和 int.
[解决办法]
那你试试在 typedef boost::signals2::signal<Signature> signal_type;
这下面加一句 typedef typename signal_type::arg<0>::type arg0_type;
然后函数里面换成 arg0_type a0 看呢.
[解决办法]
手头没有 vs2012,刚刚下了个 boost_1_54_0,用 vs2010 试了一下,没有问题,除了一坨警告。
2012 给什么错误信息?有没有试试 typename signal_type::template arg<0>::type 的写法?按标准这个 template 是必须的,有可能 vs2012 变严谨了就过不去了。
[解决办法]
那你试试在 typedef boost::signals2::signal<Signature> signal_type;
这下面加一句 typedef typename signal_type::arg<0>::type arg0_type;
然后函数里面换成 arg0_type a0 看呢.
我刚才也试过了,还是lz的方法,加上template好使,但是不知道原理来着 哎
------解决方案--------------------
boost用的太少啦 哈哈
[解决办法]
那你试试在 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
[解决办法]
那你试试在 typedef boost::signals2::signal<Signature> signal_type;
这下面加一句 typedef typename signal_type::arg<0>::type arg0_type;
然后函数里面换成 arg0_type a0 看呢.
我刚才也试过了,还是lz的方法,加上template好使,但是不知道原理来着 哎
应该是楼上吧?lz一头雾水,毫无方法
因为 signal_type::arg 是一个模板,如果不加 template 的话,编译器就认为是一个普通的类型(typedef),这时候后面加 <0> 的结构是非法的,就好像你不能写 int<0> 一样。标准要求如果 dependent type 是模板的话,要通过使用 template 关键字注明,就这样,规定而已。
[解决办法]
那你试试在 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)>的
这个和你的struct Slot里面的
void operator()(int x)有关,你如果改成
int operator()(int x)就能和书里的一致了
[解决办法]
typename是用来声明后面接着的XX::YY中YY是类型而不是类的成员变量的。具体你google一下typename就知道了。STL中也有不少这样的用法。