以下代码对我来说很好:
#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;
}
但是当我用VC9编译时,我得到以下错误
error C2070: 'float []': illegal sizeof operand
我希望这段代码能够编译。我错过了什么吗?有没有人知道解决这种奇怪行为的方法(请注意,没有模板的完全相同的事情可以很好地编译并输出3)。
请注意,删除模板不是一个选项,我做了这个例子来重现我在代码中遇到的问题,我需要包含数组的类型作为模板。
由于
答案 0 :(得分:6)
用G ++编译好。
据我所知,它可能与此错误有关:
答案 1 :(得分: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的未知边界数组”和“N T数组”)是不同的类型。 [...]
编译器问题的解决方法是直接使用完整类型声明m_kA
。持有这个尺寸的另一个静态成员也可能会有所帮助。
[我引用了C ++ 11,但据我所知,C ++ 03遵循相同的规则。 ]