错误:"Class"在其自己的定义中隐式实例化。C++11



我正在尝试学习有关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;

初始化静态成员 IdentifyF 需要调用 Matrix4 构造函数,该构造函数隐式实例化Matrix4<float>专用化,但在实例化时,类模板尚未(完全)定义。

§ 14.7.1 [临时]

-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的构造函数)

最新更新