次のコードは、私には罰金になります。C2070 - 違法のsizeofのオペランド
#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が出力されます。
テンプレートを削除することはオプションではないことに注意してください。この例では、配列を含む型がテンプレートである必要があるコードで発生している問題を再現しました。
おかげ
FWIW、GCC 4.7.1上で正常にコンパイル:http://liveworkspace.org/code/19f48dbdb07463b08a310c168ab59a67。それがもう一つのMSVCのバグなのか見てみてください。 – chris
私は、表現があなたが計算していると思っているものを計算しているとは思わない。 – Nobody
@Nobody 'sizeof array/sizeof array [0]'は、配列の長さを計算する一般的なイディオムです。それは何を計算すると思いますか、他の人が計算したと思うと思いますか? – hvd