Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 完全限定的静态成员定义赢得';不编译_C++ - Fatal编程技术网

C++ 完全限定的静态成员定义赢得';不编译

C++ 完全限定的静态成员定义赢得';不编译,c++,C++,选项#1无法编译。现在我已经考虑了一段时间,我很确定编译器认为“B”和“::C”之间的空格无关紧要,所以它试图在“B”中找到一个成员“C”。如果是这样的话,我需要一些方法让编译器相信这是两个独立的限定名 选项2和选项3似乎都在一个非常小的测试中起作用#3似乎不太容易受到名称冲突的影响,因为它更合格#3对我来说也比较容易切换。所以我倾向于#3,但它看起来很奇怪 有没有强烈的理由选择其中一个而不是另一个?我能期望这两种编译器在其他编译器上都能正常工作吗?有比这两个更好的解决方案吗?就这一点而言,我对

选项#1无法编译。现在我已经考虑了一段时间,我很确定编译器认为“B”和“::C”之间的空格无关紧要,所以它试图在“B”中找到一个成员“C”。如果是这样的话,我需要一些方法让编译器相信这是两个独立的限定名

选项2和选项3似乎都在一个非常小的测试中起作用#3似乎不太容易受到名称冲突的影响,因为它更合格#3对我来说也比较容易切换。所以我倾向于#3,但它看起来很奇怪

有没有强烈的理由选择其中一个而不是另一个?我能期望这两种编译器在其他编译器上都能正常工作吗?有比这两个更好的解决方案吗?就这一点而言,我对为什么#1失败的看法正确吗

可能不必要的细节

  • 激发这个问题的代码是由我编写的源代码生成器输出的。标识符是从生成器的输入中派生出来的,因此我担心名称冲突,特别是范围之间的无意阴影,生成器无法检测到。因此,我编写了生成器以尽可能完整地限定每个标识符
  • 我在VC2010上编译
  • 我有意不使用C++0X特性,因为我希望代码能够移植到某些较旧的编译器
  • 特定的编译器错误为“error C3083:'C”:a':'左侧的符号必须是类型
我很确定编译器认为“B”和“::C”之间的空格无关紧要,所以它试图在“B”中找到一个成员“C”

那完全正确

有没有强烈的理由选择其中一个而不是另一个?我能期望这两种编译器在其他编译器上都能正常工作吗

选项3在我看来很好(并且符合要求);也就是说,如果你真的被这个看起来相当愚蠢的要求所困扰


我自己用它来总结。

相关:谢谢。完整的资格与其说是一个要求,不如说是一个“安全”的默认。在生成的代码中还有一些其他地方需要一些限定来避开阴影。与仅选择性地限定某些事物相比,在任何地方生成完全限定的名称都更容易。如果过度的资格认证给我带来了更多的问题,我可能会重新考虑,但现在,我认为我仍然对权衡感到满意。当然,这只适用于生成的代码;我通常不会对手工编写的代码中的任何内容进行不必要的限定。
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