在静态成员数组定义中使用sizeof运算符

时间:2015-07-21 12:15:29

标签: c++ c++98

为什么我会这样:

error: invalid application of 'sizeof' to incomplete type 'A'

当我尝试这样做时:

class A
{
  int m_i;
  static char m_j[sizeof(A)];
};

我假设在这种情况下很明显sizeof(A)将是sizeof(int)。但我的编译器似乎并不这么认为。

3 个答案:

答案 0 :(得分:5)

正如错误消息所示,sizeof只能对完整类型进行操作。在您调用它时,A未完成。

答案 1 :(得分:1)

C ++编译器从上到下分析您的代码。您调用sizeof时未完全定义您的类,因此,大小尚未确定。例如,如果另一个成员声明低于该行,该怎么办:

class A
{
  int m_i;
  static char m_j[sizeof(A)]; // Uh oh, m_i2 is not known here, yet
  int m_i2;
};

由于这样的问题,只有在完全定义了类之后,即在结束大括号之后才能使用sizeof

答案 2 :(得分:0)

如果您使用模板,则可以:

template <class = void>
struct A {
    int i;

    static auto& m_j() {
        static char arr[sizeof(A)];
        return arr;
    }
};

int main()
{
    auto array = A<>::m_j();
}

编译器一直等到使用m_j来实例化该函数,此时A已被完全声明。

实例here