我正在尝试了解initializer_list<>
。我在c ++ 03上学到了,所以对我而言,这是新的。
template <typename T>
union Matrix4
{
struct
{
T m00, m01, m02, m03;
T m10, m11, m12, m13;
T m20, m21, m22, m23;
T m30, m31, m32, m33;
};
T m[16];
T mm[4][4];
Matrix4(std::initializer_list<T> values)
{
if (values.size() != 16)
{
throw InvalidArgumentException;
}
std::copy(values.begin(), values.end(), m);
}
//error: Implicit instantiation of "Matrix4<float>" within its own definition.
static Matrix4<float> Identityf = {
1.f, 0, 0, 0,
0, 1.f, 0, 0,
0, 0, 1.f, 0,
0, 0, 0, 1.f
};
}
我得到了错误的说法。我没有得到的是它为什么这么说。那就是为什么编译器不能处理这个呢?
我想要完成的事情是这样的:
typedef Matrix4<float> Matrix4f;
Matrix4f mat = Matrix4f::Identity;
答案 0 :(得分:3)
初始化静态成员IdentifyF
需要调用Matrix4
构造函数,该构造函数隐式实例化Matrix4<float>
特化,但在实例化时,类模板不是(完全)已定义。
§14.7.1[temp.inst]
-7 - 如果需要隐式实例化类模板特化并声明模板但未定义模板,则程序格式不正确。
类(或类模板)在其类主体的右括号中定义。
您可以通过将IdentityF
定义移出类体,到类模板完整的位置来使代码工作:
template <typename T>
union Matrix4
{
// ...
static Matrix4<float> Identityf;
};
template<typename T>
Matrix<float> Matrix4<T>::Identityf = {
1.f, 0, 0, 0,
0, 1.f, 0, 0,
0, 0, 1.f, 0,
0, 0, 0, 1.f
};
该问题与初始化列表无关,它适用于此时使用的任何构造函数(不仅仅是构造函数采用initializer_list
)