Это один из тех действительно странных крайних случаев в языке C ++, который имеет необычное исправление. Проблема здесь:
template<typename T>
class A<T>::D : public A<T>::B<int>
^^^^^^^^^^^^
Проблема в том, что вы пытаетесь использовать шаблонный класс B
, который является зависимым именем внутри A
(то есть, B
является шаблономвложенный в другой тип, который зависит от аргумента шаблона, здесь, T
). По умолчанию C ++ не будет относиться к зависимым именам как к именам типов или имен шаблонов, и вы должны явно сказать компилятору «да, это имя шаблона», используя ключевое слово template
необычным способом. :
template<typename T>
class A<T>::D : public A<T>::template B<int>
^^^^^^^^
Это говорит C ++ "внутри A<T>
вы найдете шаблон типа с именем B
. Пожалуйста, используйте этот шаблон с аргументом int
."
Это похоже на то, как вы должны использовать ключевое слово typename
с зависимыми типами - оно говорит компилятору «да, это имя типа». Здесь ключевое слово template
сообщает компилятору «да, это имя шаблона».