Короче говоря : специализация шаблона не будет "наследовать" ничего от шаблона, потому что вы полностью "перезапишите" реализацию шаблона, специализируя его.
Длинный ответ : похоже, вы перепутали специализацию шаблонов с наследованием. Если вы действительно хотите использовать шаблон класса, вам нужно создать его экземпляр, тем самым (неявно или явно) вы создадите группу совершенно новых классов. В отличие от наследования классов, между этими классами нет никакой связи, в результате, например, если вы написали функцию, которая принимает X<E::E1>
в качестве параметра, то компилятор отклонит вызов его с объектом X<E::E2>
.
Специализация шаблона используется для предоставления специальных реализаций некоторым указанным c параметрам шаблона. Задавая специализацию шаблона, вы попросили компилятор использовать специальную реализацию вместо создания нового класса из реализации generi c. Поэтому и X<E::E1>
, и X<E::E2>
не содержат метод f_common()
, потому что объявление f_common
не появляется в специализированных реализациях.