#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
У вас проблема с циклической зависимостью, которую можно решить только с помощью прямого объявления.