最近工作中,给代码加了命名空间,结果遇到一个意外。也或许并不是意外,但自己觉得不知道怎么解释好:VC7.1的bug?C++语法?template编译?不管怎么说,自己都觉得比较的怪异,顺便先记录一下:
定义1:///都在namespace下定义
namespace test
{
class testClass
{
};
bool operator<( const testClass &class1,const testClass &class2 )
{
return true;
}
};
使用1:///显然是肯定可以的
using namespace test;
bool test1( void )
{
testClass obj1,obj2;
return obj1 < obj2
}
使用2:///显然也是可以的
#include <vector>
#include <algorithm>
using namespace test;
void test2( void )
{
std::vector< testClass > vec;
std::sort( vec.begin(),vec.end() );
}
定义2:///类在全局定义,操作符在namespace里(虽然,你自己可能不太会这么写,但可能testClass已经定义了)
class testClass
{
};
namespace test
{
bool operator<( const testClass &class1,const testClass &class2 )
{
return true;
}
};
使用1:///也是可以的
using namespace test;
bool test1( void )
{
testClass obj1,obj2;
return obj1 < obj2
}
使用2:///意外,编译没有通过
#include <vector>
#include <algorithm>
using namespace test;
void test2( void )
{
std::vector< testClass > vec;
std::sort( vec.begin(),vec.end() );
}
使用3:///和2一样,编译不能通过
#include <vector>
#include <algorithm>
namespace test
{
void test3( void )
{
std::vector< testClass > vec;
std::sort( vec.begin(),vec.end() );
}
};
定义3:///都在全局下定义
class testClass
{
};
bool operator<( const testClass &class1,const testClass &class2 )
{
return true;
}
这种,没有任何异义,都能编译通过。
定义4:///类在namespace里,操作符在全局
这种,也没有任何异义,同样都能编译通过。
我使用的是vc71(vc.net 2003),至于vc6+sp6或别的编译器会怎样,没有试过。