我不明白这个结果

时间:2014-04-13 13:12:39

标签: c++ c++11 namespaces lookup

此代码不会在clang

中编译
#include <iostream>

namespace M {
    class B {
        public:static const int i = 1000;
    };
}

namespace N {
    class Y /*: public M::B*/ {

        class X {
            int a[i];
            static const int i = 1;

        public:
            X() { for(int j = 0; j < i; ++j ) a[j] = 1; }
            static int Get() { return i; }
        };
        public:
        int Get() { return X::Get(); }
    };
}



int main()
{
    N::Y y;
    std::cout << y.Get() << '\n';
}

但如果我注释/*: public M::B*/,则打印1.但是,如果我将语句static const int i = 1; 放在 int a[i];之前,则会在两个版本的代码,打印1。

非常感谢标准的引用。

1 个答案:

答案 0 :(得分:1)

在带有注释基类的原始代码中,您尝试使用尚未定义的名称 i

   class X {
        int a[i]; // here i is undefined
        static const int i = 1;

如果你要交换两个定义

   class X {
        static const int i = 1;
        int a[i];

然后代码将成功编译,因为我在数组定义中使用的是之前定义的..

当基类被取消注释时,则在此定义中

        int a[i];

i是B类的静态数据成员,该数组定义为

        int a[1000];

之后,您定义了类X的静态数据成员i,它隐藏了类X中类Y的基类B的静态数据成员。