Вперед объявить стандартный контейнер?
Можно ли заранее объявить стандартный контейнер в заголовочном файле? Например, возьмите следующий код:
#include <vector>
class Foo
{
private:
std::vector<int> container_;
...
};
Я хочу иметь возможность сделать что-то вроде этого:
namespace std
{
template <typename T> class vector;
}
class Foo
{
private:
std::vector<int> container_;
...
};
Можно ли это сделать?
Ответы
Ответ 1
Объявление vector
в пространстве имен std
- undefined поведение. Таким образом, ваш код может работать, но он также может и не быть, и компилятор не обязан сообщать вам, когда ваша попытка не будет работать. Это игра, и я не знаю, что избежать включения стандартного заголовка С++ стоит того.
См. следующий компилятор comp.std.С++.
переслать объявление std::vector. Работает, но является ли он законным и стандартным?
Ответ 2
Я так не думаю, потому что компилятор не мог бы узнать, сколько места выделяется для объекта container_
. В лучшем случае вы можете сделать:
std::vector<int> *container_;
и новый в конструкторе, так как компилятор знает размер указателя.
Ответ 3
Помимо того, что сказали другие, вам может быть полезно знать, что существует санкционированный способ объявления iostream вперед и некоторых связанных шаблонов: Заголовок <iosfwd>
. Было бы полезно, если бы в стандарте было больше таких заголовков.