Boost库中宏BOOST_AUTO与C++新特性--auto关键字

1 篇文章 0 订阅

近日,学习《Boost 程序库完全开放指南(第2版)》的时候发现一个问题。

具体到章节是3.6.4 打破循环引用。里面的内容这里就不在复述了,请有兴趣的同学自己看吧。主要是里面给出的示例代码我在VS2008中调试不通过。

代码贴出如下:

#include <iostream>
#include <boost/assert.hpp>
#include <boost/smart_ptr.hpp>
#include <boost/make_shared.hpp>
#include <boost/typeof/typeof.hpp>

 using namespace boost;
 using namespace std;
 class node {
     public: ~node() {
         cout << "deleted" << endl; 
     } 
     int x; 
     //typedef shared_ptr<node> ptr_type;
     typedef weak_ptr<node> ptr_type;
     ptr_type next; 
 };

 int main() {
     BOOST_AUTO(p1, make_shared<node>());
     BOOST_AUTO(p2, make_shared<node>());

     p1->next = p2;
     p2->next = p1;

     assert(p1.use_count() == 1); 
     assert(p2.use_count() == 1); 
     if (!p1->next.expired()) { 
         BOOST_AUTO(p3, p1->next.lock()); 
     } 
 }

编译程序不通过,出现转换类型失败的错误,其不能自动推导出表达式的类型,说明编译器是不支持auto关键字的。

查阅资料发现,auto关键字是C++新标准C++11中新增加的,因为实际上C++编译器是知道表达式类型的,所以可以让编译器在编译时代替我们自动推到表达式的类型。

而boost库中<boost/typeof/typeof.hpp>里面定义了宏:BOOST_AUTO仿真了C++新标准的auto关键字。它不仅能够推导C++语言内建的int、double、数组、函数指针等等类型,而且支持标准库中的容器类型,使程序员再也不需要写复杂的类型定义就能轻松声明变量。

那么,上面的代码就可以更改如下:int main() { BOOST_AUTO(p1, make_shared<node>()); BOOST_AUTO(p2, make_shared<node>()); p1->next = p2; p2->next = p1; assert(p1.use_count() == 1); assert(p2.use_count() == 1); if (!p1->next.expired()) { BOOST_AUTO(p3, p1->next.lock()); } }

再次编译就没有错误了。

更多编译器支持情况对比请参照以下网址:

http://www.csdn.net/article/2012-08-13/2808540

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值