Ошибка: неявное создание экземпляра & quot; класса & quot; в своем собственном определении. 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;

0

Решение

Инициализация статического члена 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)

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]