Ответ 1
Вы наткнулись на синтаксис "раннего определения" (подробнее).
Ознакомьтесь с разделом 5.1.6 спецификации языка:
Раннее определение проверяется и проверяется по типу, которое действует непосредственно перед определением шаблона, дополненным любым параметры типа охватывающего класса и любые ранние определения предшествующий той, которая определена. В частности, любая ссылка на
this
в правой части раннего определения относится к личности изthis
за пределами шаблона. Следовательно, невозможно, чтобы раннее определение относится к объекту, создаваемому шаблон или относится к одному из его полей и методов, за исключением любого другое предыдущее раннее определение в том же разделе.
В вашем случае проблема связана с this.x
. Если вы замените его только на x
, значит, вы ссылаетесь на "предыдущее раннее определение", как упоминалось в последнем предложении выше (спасибо, @som-snytt!), Он компилируется.
Конечно, вы, вероятно, не собирались писать ранний инициализатор, поэтому просто напишите его в ответ на вопрос Кристиана Домагалы.