首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于boost库的一段代码,有些有关问题不懂,来请问一下

2013-08-01 
关于boost库的一段代码,有些问题不懂,来请教一下啊templateint Nstruct Slot{void operator()(int x){co

关于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 看呢.
[解决办法]
引用:
Quote: 引用:

楼主 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.

boost_1_53_0+vs2012

手头没有 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用的太少啦 哈哈
[解决办法]

引用:
Quote: 引用:

Quote: 引用:

那你试试在  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
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

那你试试在  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 关键字注明,就这样,规定而已。
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

那你试试在  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中也有不少这样的用法。

热点排行