C++ 完全限定的静态成员定义赢得';不编译
选项#1无法编译。现在我已经考虑了一段时间,我很确定编译器认为“B”和“::C”之间的空格无关紧要,所以它试图在“B”中找到一个成员“C”。如果是这样的话,我需要一些方法让编译器相信这是两个独立的限定名 选项2和选项3似乎都在一个非常小的测试中起作用#3似乎不太容易受到名称冲突的影响,因为它更合格#3对我来说也比较容易切换。所以我倾向于#3,但它看起来很奇怪 有没有强烈的理由选择其中一个而不是另一个?我能期望这两种编译器在其他编译器上都能正常工作吗?有比这两个更好的解决方案吗?就这一点而言,我对为什么#1失败的看法正确吗 可能不必要的细节C++ 完全限定的静态成员定义赢得';不编译,c++,C++,选项#1无法编译。现在我已经考虑了一段时间,我很确定编译器认为“B”和“::C”之间的空格无关紧要,所以它试图在“B”中找到一个成员“C”。如果是这样的话,我需要一些方法让编译器相信这是两个独立的限定名 选项2和选项3似乎都在一个非常小的测试中起作用#3似乎不太容易受到名称冲突的影响,因为它更合格#3对我来说也比较容易切换。所以我倾向于#3,但它看起来很奇怪 有没有强烈的理由选择其中一个而不是另一个?我能期望这两种编译器在其他编译器上都能正常工作吗?有比这两个更好的解决方案吗?就这一点而言,我对
- 激发这个问题的代码是由我编写的源代码生成器输出的。标识符是从生成器的输入中派生出来的,因此我担心名称冲突,特别是范围之间的无意阴影,生成器无法检测到。因此,我编写了生成器以尽可能完整地限定每个标识符
- 我在VC2010上编译
- 我有意不使用C++0X特性,因为我希望代码能够移植到某些较旧的编译器
- 特定的编译器错误为“error C3083:'C”:a':'左侧的符号必须是类型
我自己用它来总结。相关:谢谢。完整的资格与其说是一个要求,不如说是一个“安全”的默认。在生成的代码中还有一些其他地方需要一些限定来避开阴影。与仅选择性地限定某些事物相比,在任何地方生成完全限定的名称都更容易。如果过度的资格认证给我带来了更多的问题,我可能会重新考虑,但现在,我认为我仍然对权衡感到满意。当然,这只适用于生成的代码;我通常不会对手工编写的代码中的任何内容进行不必要的限定。
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