Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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++ C2070-操作数大小非法_C++_Visual Studio 2008_Sizeof_Visual C++ - Fatal编程技术网

C++ C2070-操作数大小非法

C++ C2070-操作数大小非法,c++,visual-studio-2008,sizeof,visual-c++,C++,Visual Studio 2008,Sizeof,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(

以下代码在我看来很好:

    #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;
    }
我希望这段代码能够编译。我错过什么了吗?有人知道修复这种奇怪行为的方法吗(请注意,没有模板的情况下,完全相同的东西可以很好地编译并输出3)

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

谢谢

它可以用G++很好地编译

据我所知,这可能与此bug有关:


它定义得很清楚。请注意,在类定义中,
m_kA
是用type
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化合物类型[基本化合物]:

6[…]数组对象的声明类型可能是大小未知的数组,因此在转换单元中的某一点不完整,以后才完整;这两点的数组类型(“T的未知界数组”和“N的数组”)是不同的类型。[……]

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


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

FWIW,在GCC 4.7.1上编译良好:。请注意,这可能是另一个MSVC错误或其他什么。我不认为表达式正在计算您认为它正在计算的内容。@Nobody
sizeof array/sizeof array[0]
是计算数组长度的常用习惯用法。你认为它能算出什么,或者你认为其他人认为它能算出什么?@没人,你为什么这么说?当你在<代码> sieOS/<代码> >时,数组不会衰减。至于实际问题,在类声明中明确指定数组的长度是否是一个选项(即使是麻烦的)?如果C++允许我做,我会很乐意在初始化器中嵌入。问题是,据我所知,我只能对局部或全局变量这样做,因此我无法为它制作模板。正如我之前所说,我发现很难证明VC9是正确的,因为如果我只删除模板,一切都会正常工作。再想想,像(注意:无效的C++)这样的结构是一个合理的理由,为什么类型应该保留
float[]
,而不是
float[3]
。但正如我们在现已删除的讨论中所看到的,类型实际上是
float[3]
。报告的bug显示了我遇到的相同问题,我将尝试找到解决方法
error C2070: 'float []': illegal sizeof operand