Предотвращение неявной реализации в шаблоне класса

0

Я пытаюсь объявить класс 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>'

  • 0
    может быть, идиома политики клон что-то для вас
  • 2
    Можете ли вы привести нам полный пример, который не скомпилируется, или хотя бы сказать, какой компилятор не скомпилирует это? Когда я добавляю main который создает экземпляр B<int> он прекрасно компилируется с g ++ 4.4 и 4.5.
Показать ещё 1 комментарий
Теги:
templates
implicit

1 ответ

0
Лучший ответ

Кажется, это ошибка в g++ - 4.2, так как я могу воспроизвести вашу проблему с этим компилятором.

Если вы можете переместиться как минимум в 4.4, ваш код будет компилироваться как есть. В качестве альтернативы вы можете написать A< ::B, T1>* example; чтобы заставить его использовать шаблон глобальной сферы, который компилируется в 4.2.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню