Я пытаюсь объявить класс B, как указано ниже. Проблема в том, насколько я знаю, A<B, T1>
фактически неявно рассматривается как A<B<T1>, T1>
который не соответствует определению класса A. Поэтому мой вопрос: можно ли использовать класс 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 '
error: ожидается шаблон класса, получил 'B <T1>'
Кажется, это ошибка в g++ - 4.2, так как я могу воспроизвести вашу проблему с этим компилятором.
Если вы можете переместиться как минимум в 4.4, ваш код будет компилироваться как есть. В качестве альтернативы вы можете написать A< ::B, T1>* example;
чтобы заставить его использовать шаблон глобальной сферы, который компилируется в 4.2.
main
который создает экземплярB<int>
он прекрасно компилируется с g ++ 4.4 и 4.5.