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

时间:2021-09-16 04:00:09

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

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


问题是否出在std::sort()里面?为了让问题更清晰,我们把std::sort()原码提出来。
将std::sort()中相关代码提出,生成std::my_sort().

#include <vector>
#include <algorithm>

class testClass
{
};

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

    {
        return true;
    }
};

using namespace test;

namespace std
{
    template<typename _RandomAccessIterator>
    void mysort(_RandomAccessIterator __first,
                _RandomAccessIterator __last)

    {
        if (*__first < *__last)
            ;
    }
}

main()
{
    std::vector<testClass> vec;
    mysort(vec.begin(), vec.end());
}

正如所预料的,问题就在小于操作符的使用上。
再简化一点,去除iterator。如下代码问题依旧。

#include <vector>
#include <algorithm>

class testClass
{
};

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

    {
        return true;
    }
};

using namespace test;

namespace std
{
    void testCompare(const testClass & t1,
                     const testClass & t2)

    {
        if (t1 < t2)
            ;
    }
}

main()
{
    testClass t1, t2;
    std::testCompare(t1, t2);
}

但是把testCompare()的命名空间改掉,如std001,竟然可以通过了!
testCompare()的namespace是std或是std001会有什么差别呢?
难道编译器对std库有特殊处理?不会。
可能是std namespace中有些声明造成了影响。

好,我们现在不需要std库了,把两个#include删去,
但是保持std::testCompare(),果然通过了。
再include一个stl头文件,又是错误!



待续...

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