STL контейнеры и незавершенные типы.
столкнулся с вопросом можно ли делать членами класса STL контейнеры незавершенных типов.
в общем случае создавать такие контейнеры нельзя, такой код не скомпилится:
class foo;
void f() {
std::vector[foo] b;
}
такой как минимум выругается что не может вызвать деструктор:
class bar {
public:
bar(){}
~bar(){}
private:
std::vector[foo] b;
};
а вот если написать
class bar {
public:
bar();
~bar();
private:
std::vector[foo] b;
};
то это уже может и сработать, если std::vector используется только внутри этого класса, главное чтобы там где определяются конструктор и деструктор bar, class foo уже был определен.
но формально это запрещенно, хоть компилеры и не ругаются на такое.
другие контейнеры с незавершенными типами в основном не работают, вектор тут исключение потому что ему внутри нужно хранить только указатель на тип.