C++标准中的局部类定义,居然在visual studio 2003 .net滴编译器还只认类型定义时的的局部类型定义,比如:
class T {
struct X {
};
public:
void foo();
};
倒是能通过编译,可最近些了这样的代码:
// 继续使用上面的code哦
void T::foo() {
struct Y{
//...
};
// use type Y in here
//...
}
这个时候vc71那个编译器就报错了!
好在同僚的visual studio 2005 .net滴c++ compiler能支持此种情况.所以,考虑到compilet对代码的兼容性,我做了个折衷,写了这样的代码:
// 原来的xxx.h
class T {
struct X {
};
public:
void foo();
};
// 在使用这个类型Y的xxx.cpp中使用namespace {}
// ...
namespace
{
struct Y {
};
} // end of ::
void T::foo() {
// use type Y in here
//...
}
此处使我想起了Loki库中的另一折衷方案:
namespace Private
{
struct Y
{
};
} // end of ::Private
真是老手写的啦,这里不仅保留了对名称标识的控制权,还避免了觅名namespace被嵌套在另一namespace时的尴尬情形.
所以这里给自己提个醒:当很确定一个类型只被临时用于一个文件域内时,才使用anoymous namespace.