原创 不可思议:using namespace无效!(1)收藏


不可思议:using namespace无效!(1)
C++ namespace与name lookup之惑


问题由 清风雨 于2005年底在 “namespace 和 操作符重载” 一文中提出,
讨论众多,但疑惑未解。


翻到此文时觉得不可思议,可事实如此,试了多个编译器都是相同结果。
试图去解释,可是过后细想还是有问题。
经查阅相关概念,大胆猜想并编码求证,终于有了一个合理解释,希望与大家共同研究。


原文中,在test命名空间重载了一个小于操作符("<"),并使用

    using namespace test;
   
进行使用。

可是出乎意料,std::sort()使用该"<"操作符时编译出错!

代码如下:

#include <vector>
#include <algorithm>

class testClass
{
};

namespace test
{
    bool operator<( const testClass &class1,
                    const testClass &class2 )

    {
        return true;
    }
};

using namespace test;

main()
{
    std::vector< testClass > vec;
    std::sort( vec.begin(),vec.end() );    // Fail!
}


对该代码请注意以下几点:

* 编译错误显示为:no match for 'operator<'.

* operator< 与类testClass不在一个命名空间。
如定义于同一命名空间或都是全局的则可以通过。

* 若类定义于namespace, 而操作符是全局的,也可以。

* operator< 是可见并可用的,如

using namespace test;

main()
{
    testClass obj1,obj2;
    bool b = obj1 < obj2;    // OK
}

* 即使std::sort()调用在test空间同,也是不行。

namespace test
{
    void test_sort( void )
    {
        std::vector< testClass > vec;
        std::sort( vec.begin(),vec.end() );    // Fail!
    }
};


仿佛“using namespace test;”并没有起效?

引用清风雨的原话:"我只是觉得,编译器应该在可见空间里,找到operator<。
而且直接使用也是可以的,只是用了std::sort就不可以了,这个感觉就有些怪怪的了。"



待续...

不可思议:using namespace无效!(2)
不可思议:using namespace无效!(3)

发表于 @ 2006年07月25日 14:13:00|评论(loading...)

新一篇: 不可思议:using namespace无效!(2) | 旧一篇: 最简单的一个wxPython窗口

用户操作
[即时聊天] [发私信] [加为好友]
金庆
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
金庆的公告
XSTL封面 Locations of visitors to this page Codeguru Contributor
订阅 上海程序员
文章分类
收藏
    热门文章
    1 评“程序员怎么样才能保证自己的程序没有BUG”
    2 C语言HTML解析器ekhtml的VC编译
    3 log4cpp应用速成手册
    4 一个hash_map使用错误
    5 udp广播与直接广播
    6 评“加班文化”对软件企业的危害
    作者推荐
    1 设计死了吗?
    2 葵花宝典:软件开发高手是这样炼成的!
    3 TCP截包分段重组的设计
    4 Firefox的HTTP内容解压代码阅读
    5 不可思议:using namespace无效!
    6 作业调度问题深度搜索定界算法
    7 智能机器人编程游戏robocode的运行代码简析
    存档
    Csdn Blog version 3.1a
    Copyright © 金庆