Подтвердить что ты не робот

Вперед объявить стандартный контейнер?

Можно ли заранее объявить стандартный контейнер в заголовочном файле? Например, возьмите следующий код:

#include <vector>

class Foo
{
private:
    std::vector<int> container_;
    ...
};

Я хочу иметь возможность сделать что-то вроде этого:

namespace std
{
    template <typename T> class vector;
}

class Foo
{
private:
    std::vector<int> container_;
    ...
};

Можно ли это сделать?

4b9b3361

Ответ 1

Объявление vector в пространстве имен std - undefined поведение. Таким образом, ваш код может работать, но он также может и не быть, и компилятор не обязан сообщать вам, когда ваша попытка не будет работать. Это игра, и я не знаю, что избежать включения стандартного заголовка С++ стоит того.

См. следующий компилятор comp.std.С++.

переслать объявление std::vector. Работает, но является ли он законным и стандартным?

Ответ 2

Я так не думаю, потому что компилятор не мог бы узнать, сколько места выделяется для объекта container_. В лучшем случае вы можете сделать:

std::vector<int> *container_;

и новый в конструкторе, так как компилятор знает размер указателя.

Ответ 3

Помимо того, что сказали другие, вам может быть полезно знать, что существует санкционированный способ объявления iostream вперед и некоторых связанных шаблонов: Заголовок <iosfwd>. Было бы полезно, если бы в стандарте было больше таких заголовков.