Я пытаюсь объявить класс B, такой как написано ниже. Проблема, насколько я знаю, A<B, T1>
на самом деле неявно рассматривается как A<B<T1>, T1>
который не соответствует определению класса А. Поэтому мой вопрос таков: возможно ли использовать класс B внутри его собственного определения в его «неинстанцированной» форме? И если так, как?
template <template <class T1> class T2, class T1>
class A {
};
template <class T1>
class B {
A<B, T1>* example;
};
что приводит к следующей ошибке компиляции с gcc4.2:
ошибка: несоответствие типа / значения в аргументе 1 в списке параметров шаблона для шаблона < шаблон < класс T1> класс T2, класс T1> класс A ‘
ошибка: ожидал шаблон класса, получил ‘B< T1> ‘
Это похоже на ошибку в g ++ — 4.2, так как я могу воспроизвести вашу проблему с этим компилятором.
Если вы можете перейти как минимум на 4.4, ваш код будет скомпилирован как есть. Вы также можете написать A< ::B, T1>* example;
заставить его использовать шаблон глобальной области видимости, который компилируется в 4.2.
Других решений пока нет …