Форвард объявить контейнер STL? - PullRequest
46 голосов
/ 21 ноября 2008

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

#include <vector>

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

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

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

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

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

Ответы [ 3 ]

32 голосов
/ 21 ноября 2008

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

См. Следующее comp.std.c ++. Модерируемое обсуждение:

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

17 голосов
/ 21 ноября 2008

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

std::vector<int> *container_;

и добавьте его в конструктор, поскольку компилятор знает размер указателя.

9 голосов
/ 13 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...