不可思议:using namespace无效!(2)
不可思议: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)