免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2908 | 回复: 9
打印 上一主题 下一主题

[C++] 关于boost中的一段代码的疑问--编译器怎么找到函数的[已解决] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-29 21:57 |只看该作者 |倒序浏览
以下是官方给出的调用boost库中program_options的代码范例(这里仅节选了部分):

  1. #include <boost/program_options.hpp>
  2. namespace po = boost::program_options;

  3. #include <iostream>
  4. #include <fstream>
  5. #include <iterator>
  6. using namespace std;

  7. int main(int ac, char* av[])
  8. {
  9.     try {
  10.         int opt;

  11.         po::options_description config("Configuration");
  12.         config.add_options()
  13.             ("optimization", po::value<int>(&opt)->default_value(10),
  14.                   "optimization level")
  15.             ("include-path,I",
  16.                  po::value< vector<string> >()->composing(),
  17.                  "include path")
  18.             ;

  19.         po::variables_map vm;
  20.         po::options_description config_file_options;
  21.         config_file_options.add(config);

  22.         ifstream ifs("multiple_sources.cfg");
  23.         store(parse_config_file(ifs, config_file_options), vm);
  24.         notify(vm);
  25.         cout << "Optimization level is " << opt << "\n";
  26.     }
  27.     catch(exception& e)
  28.    {
  29.         cout <<"error:" << e.what() << "\n";
  30.         return 1;
  31.     }
  32.     return 0;
  33. }
复制代码


这段代码可以通过编译,我的疑问是按照头文件boost/program_options.hpp中的定义,store和notify函数是在名字空间boost::program_options中声明的,这里没有指定,编译器是怎么定位此函数的?

[ 本帖最后由 Suchangyu 于 2008-12-1 17:51 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2008-11-30 11:41 |只看该作者
没看到
namespace po = boost::program_options;
这一句?

论坛徽章:
0
3 [报告]
发表于 2008-12-01 14:49 |只看该作者
原帖由 lenovo 于 2008-11-30 11:41 发表
没看到
namespace po = boost::program_options;
这一句?


这里是定义了一个名字空间别名。
但是由于没有使用using,这个别名在main中应该是不可见的吧?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2008-12-01 15:15 |只看该作者
原帖由 Suchangyu 于 2008-12-1 14:49 发表


这里是定义了一个名字空间别名。
但是由于没有使用using,这个别名在main中应该是不可见的吧?

那你说

  1. po::options_description config_file_options;
复制代码

是什么意思?
这么短短几行代码,你每句都搞懂了吗?

论坛徽章:
0
5 [报告]
发表于 2008-12-01 15:29 |只看该作者
原帖由 lenovo 于 2008-12-1 15:15 发表

那你说

po:ptions_description config_file_options;
是什么意思?
这么短短几行代码,你每句都搞懂了吗?


我的理解是:
声明了一个类对象config_file_options,这个对象是在名字空间po中定义的options_description类的实例。

ps. 每句完成的事情(功能)我都清楚,但是为什么可以这样用,还理解得不深。
请版主指正。

[ 本帖最后由 Suchangyu 于 2008-12-1 15:31 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2008-12-01 16:10 |只看该作者
原帖由 Suchangyu 于 2008-12-1 15:29 发表


我的理解是:
声明了一个类对象config_file_options,这个对象是在名字空间po中定义的options_description类的实例。

ps. 每句完成的事情(功能)我都清楚,但是为什么可以这样用,还理解得不深。
请版 ...

名字空间po指得是哪个名字空间?
建议你复习一下名字空间的用法。
看看有几种使用方式。

论坛徽章:
0
7 [报告]
发表于 2008-12-01 16:26 |只看该作者
原帖由 lenovo 于 2008-12-1 16:10 发表

名字空间po指得是哪个名字空间?
建议你复习一下名字空间的用法。
看看有几种使用方式。


名字空间po就是boost::program_options。

我就只知道using的一种方法的,请版主提示一下吧。

论坛徽章:
0
8 [报告]
发表于 2008-12-01 16:29 |只看该作者
原帖由 lenovo 于 2008-12-1 16:10 发表

名字空间po指得是哪个名字空间?
建议你复习一下名字空间的用法。
看看有几种使用方式。

我想lz问的是boost::program_options::store 为什么可以简写成store? 还有boost::program_options::notify也是。。。。
其他在boost::program_options这个域下的函数都有 po:: 啊,就这两个没有

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2008-12-01 17:17 |只看该作者
原帖由 5毛党党员 于 2008-12-1 16:29 发表

我想lz问的是boost::program_options::store 为什么可以简写成store? 还有boost::program_options::notify也是。。。。
其他在boost::program_options这个域下的函数都有 po:: 啊,就这两个没有

怪我没仔细看清楚问题。
不过我手头上并没有boost可以测试,
去他们网站找了如下资料:
http://www.boost.org/doc/libs/1_ ... tions/tutorial.html
可以看到前面是有po的。

论坛徽章:
0
10 [报告]
发表于 2008-12-01 17:47 |只看该作者

回复 #9 lenovo 的帖子

谢谢版主的解答,我找到问题答案了。
这是c++编译是容易被忽略的名字空间查找规则:
在C++中有这样一个名字查找规则--如果在声明函数的参数时使用了一个类,那么在查找匹配的函数名字时,编译器会在包含参数类型的名字空间中也进行查找


请参考如下文章:
http://blog.csdn.net/starlee/archive/2007/12/10/1926377.aspx

我用g++ (GCC) 3.4.5 做了试验,验证了该规则。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP