ошибка наследования шаблона в c

#c #templates #inheritance #header-files

#c #шаблоны #наследование #заголовочные файлы

Вопрос:

У меня есть два файла заголовков A.h (включает в себя чисто виртуальную функцию) и B.h.

A.h :

 #ifndef __A_H__
#define __A_H__

#include "B.h"
template <class T>
class A
{
   virtual B<T> f()=0;
};

#endif
  

B.h :

 #ifndef __B_H__
#define __B_H__

#include "A.h"
template <class T>
class B : public A <T> 
{
  B<T> f(){}
};

#endif
  

но когда я компилирую, это выдает мне такую ошибку
В файле, включенном из B.h: 4,
из Test.cpp: 1:
A.h:10: ошибка: ISO C запрещает объявление ‘B’ без типа
A.h:10: ошибка: ‘B’ объявлено как ‘виртуальное’ поле
A.h:10: ошибка: ожидаемая ‘;’ перед ‘<’ токеном

 #include "B.h"

int main() {
 return 0;
}
  

как я могу это решить?
Спасибо

Комментарии:

1. Можете ли вы объяснить, почему абстрактному базовому классу необходимо объявить виртуальную функцию, которая возвращает экземпляр производного класса? Я знаю, что ваш код представляет собой минимальный пример, но я не понимаю, зачем вам это нужно. Похоже, вы хотели бы подойти к этому по-другому.

2. та же логика со ссылками ниже

3. Не относящееся к делу примечание: имена с двойным подчеркиванием, такие как __A_H__ , зарезервированы для реализации (т. Е. компилятора и стандартной библиотеки). Поэтому неплохо бы принять другое соглашение.

Ответ №1:

Единственный способ — это прямое объявление :

 #ifndef __A_H__
#define __A_H__

template< typename > class B;

template <class T>
class A
{
   virtual B<T>* f()=0;
};

#endif
  

У вас проблема с циклической зависимостью, которую можно решить только с помощью прямого объявления.