C2070 - 非法大小的操作数

val*_*rio 8 c++ sizeof visual-studio-2008 visual-c++

以下代码对我来说很好看:

    #include <stdio.h>

    template <typename T>
    struct A
    {
        static float m_kA[];
    };

    template <typename T>
    float A<T>::m_kA[] = {1.0f, 2.0f, 3.0f};

    int main()
    {
        printf("%d\n", 
            sizeof(A<unsigned int>::m_kA) /
            sizeof(A<unsigned int>::m_kA[0]));
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

但是当我用VC9编译时,我得到以下错误

error C2070: 'float []': illegal sizeof operand
Run Code Online (Sandbox Code Playgroud)

我希望这段代码能够编译.我错过了什么吗?有没有人知道一种方法来解决这种奇怪的行为(请注意,没有模板的完全相同的事情编译好并输出3).

请注意,删除模板不是一个选项,我做了这个例子来重现我在代码中的问题,我需要包含数组的类型作为模板.

谢谢

Luc*_*ton 5

它定义明确.请注意,在类定义中,m_kA使用类型声明float[],这是一种不完整的类型,不能与其一起使用sizeof.在定义中m_kA,它被重新声明为具有类型float[3],之后可以使用sizeof.(8.3.4管理数组声明的含义.)

从3.4.6使用指令和命名空间别名[basic.lookup.udir]:

10在对类型进行所有调整(其中typedefs(7.1.3)被其定义替换)之后,引用给定变量或函数的所有声明指定的类型应相同,除了数组对象的声明可以指定数组类型因主要数组的存在与否而不同(8.3.4).违反此规则的类型标识不需要诊断.

从3.9.2复合类型[basic.compound]:

6 [...]数组对象的声明类型可能是一个未知大小的数组,因此在翻译单元的某一点不完整,稍后会完成; 这两个点的数组类型("T的未知边界数组"和"NT数组")是不同的类型.[...]

编译器问题的解决方法是m_kA直接使用完整类型声明.另一个保持大小的静态成员也可能有所帮助.

[我引用了C++ 11,但据我所知,C++ 03遵循相同的规则.]