Компилятор должен знать, как большой "B" - прежде чем это сможет генерировать соответствующую информацию макета. Если бы вместо этого, Вы сказали std::vector<B*>
, то компилятор не должен был бы знать, как большой B - то, потому что это знает, насколько большой указатель.
Фактически ваш пример будет построен, если конструктор A будет реализован в модуле компиляции, который знает тип B.
Экземпляр std :: vector имеет фиксированный размер, независимо от того, что такое T, поскольку он содержит, как уже говорили другие, только указатель на T. Но конструктор вектора зависит от конкретного типа. Ваш пример не компилируется, потому что A () пытается вызвать вектор ctor, который не может быть сгенерирован без знания B. Вот что будет работать:
Объявление A:
// A.h
#include <vector>
class B; // Forward declaration.
class A
{
public:
A(); // only declare, don't implement here
private:
std::vector<B> v;
};
Реализация A:
// A.cpp
#include "A.h"
#include "B.h"
A::A() // this implicitly calls vector<B>'s constructor
{
std::cout << v.size() << std::endl;
}
Теперь пользователю A нужно знать только A, а не B:
// main.cpp
#include "A.h"
int main()
{
A a; // compiles OK
}
Инстанцировать A:: v, компилятор должен знать конкретный тип B.
, При попытке минимизировать сумму #included багажа для улучшения времени компиляции, существует две вещи, которые можно сделать, которые являются действительно изменениями друг друга:
Это - больше, чем просто размер B, это необходимо. Современные компиляторы будут иметь необычные приемы для ускорения векторных копий с помощью memcpy, если это возможно, например. Это обычно достигается путем неравнодушной специализации на мысе POD типа элемента. Вы не можете сказать, является ли B POD из предописания.
Это не имеет значения, используете ли Вы вектор или просто пытаетесь инстанцировать одного B. Инстанцирование требует полного определения объекта.
Причина, по которой вы не можете использовать предварительную декларацию, заключается в том, что размер B неизвестен.
В вашем примере нет причины, по которой вы не можете включить Bh внутри Ah, так какую проблему вы действительно пытаетесь решить?
Редактировать: Есть еще один способ решить эту проблему проблема тоже: прекратите использовать C / C ++! Это так 1970-х годов ...;)