Он там не вызывается. Этот приватный конструктор используется в функции
void lib::LinkedList<T>::push(const T&) [with T = Item<int>]
, которая в шаблоне (там где вы создаете
Node* tmp
). При первом обращении к этой функции компилятор пытается ее инстанциировать и натыкается на эту проблему, о чем и сообщает вам. Пока эта функция вообще никак нигде не используется - программа компилируется.
В приведенных вами примерах вы эту функцию так или иначе трогаете разными способами.
lib::LinkedList<Item<int>> list = lib::LinkedList<Item<int>>()
вызвает проблему пока у вас есть virtual метод в интерфейсе, потому что это тут вызывается конструктор копирования (сначала конструктор по умолчанию для временного
lib::LinkedList<Item<int>>()
, а потом это все копируется в конструируемый list).
Этот конструктор копирования должен будет также скопировать таблицу виртуальных вызовов и тут компилятору понадобится знать про запретный метод push. Похоже. Я не уверен точно, почему это проявляется именно в конструкторе копирования, где-то в недрах стандарта про это, наверняка, написано.
Если вы напишите
lib::LinkedList<Item<int>> list()
- то все скомпилируется, потому что конструктор по умолчанию, видимо, не требует знания о методе push. Также удаление virtual или наследования вылечит эту проблему.
Далее, точно по этой же причине не скомпилируется
list.push(a)
- это прямой вызов этой запретной функции. Если же вы напишите
list.push(Item<int>())
, то оно скомпилируется потому что тут вызывается push с перемещением.
Но для исправления этого кода вам надо прежде всего избавится от этой поломанной функции push.