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.