Фактически ваш пример будет построен, если конструктор A будет реализован в модуле компиляции, который знает тип B.
Экземпляр std :: vector имеет фиксированный размер, независимо от того, что такое T, поскольку он содержит, как уже говорили другие, только указатель на T. Но конструктор вектора зависит от конкретного типа. Ваш пример не компилируется, потому что A () пытается вызвать ctor вектора, который не может быть сгенерирован без знания B. Вот что будет работать:
декларация А:
// 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
}