namespace A
{
class B
{
public:
B(int);
};
}
namespace C
{
class D
{
static const ::A::B b;
};
}
const ::A::B ::C::D::b(0); // #1
// const ::A::B C::D::b(0); // #2
// const ::A::B (::C::D::b)(0); // #3
选项#1无法编译。现在我已经考虑了一段时间了,我很肯定编译器认为“B”和“:: C”之间的空白不重要,所以它试图在“B”中找到一个成员“C”。如果发生了这种情况,我需要一些方法来说服编译器这些是两个单独的限定名。完全限定的静态成员定义不会编译
选项#2和#3似乎都在非常小的测试中工作。 #3似乎不太容易受到名称冲突的影响,因为它更合格。 #3对我来说也更容易切换到。所以我倾向于#3,但看起来很奇怪。
有没有强烈的理由更喜欢一个比另一个?我可以期待在其他编译器上正常工作吗?有没有比两者更好的解决方案?就此而言,我是否正确地说明为什么#1失败?
大概不必要的细节
- 启发这个问题的代码是由源代码生成我写的输出。标识符来源于生成器的输入,所以我担心名称冲突,特别是示波器之间无意识的阴影,而生成器无法检测到这种阴影。所以,我写了生成器以尽可能充分地限定每个标识符。
- 我在VC2010编译。
- 我故意不是使用C++ 0X功能,因为我希望代码可以移植到某些较旧的编译器。
- 具体的编译器错误是“错误C3083:‘C’:在符号左侧的‘::’必须是一种”
**相关:** http://kera.name/articles/2011/02/befriending-your-parser/ – 2012-01-10 00:11:33