近日,学习《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()); } }
再次编译就没有错误了。
更多编译器支持情况对比请参照以下网址: