VS2008 внешние шаблоны - PullRequest
3 голосов
/ 23 ноября 2010

Microsoft имеет расширение , благодаря чему можно объявить, что создание шаблона будет внешним;следовательно, он не становится неявным образом созданным.По крайней мере, это теория.Я попытался воспроизвести это с кодом

#include <vector>

class Foo{
    int i;
public:
    virtual ~Foo();
};

extern template class std::vector<Foo>;

Это дает мне

warning C4231: nonstandard extension used : 'extern' before template 
explicit instantiation

Однако, похоже, больше ничего не происходит: программа продолжает искать ссылки, даже если я использую push_back (иdumpbin показывает, что был создан экземпляр push_back).

Только когда я объявляю

extern template void std::vector<Foo>::push_back(const Foo&);

Я получаю ошибку компоновщика, как и ожидалось.

Итак: как я могу объявить всю реализацию(все члены) как явные, предотвращающие неявную реализацию?

1 Ответ

6 голосов
/ 23 ноября 2010

Я думаю, что вас укусила эта заметка в документах для расширения:

Ключевое слово extern в специализации применяется только к функциям-членам, определенным вне тела класса. Функции, определенные в объявлении класса, считаются встроенными функциями и всегда создаются.

vector::push_back() (и большинство или весь шаблон std :: vector <>) определен внутри объявления класса.

Учитывая то, что говорится в примечании, кажется, что extern на функции-члене все еще должен приводить к созданию экземпляра, но не удивлюсь, что это расширение недостаточно документировано или недостаточно указано.

Я подозреваю, что вы не сможете делать то, что вы хотите, без явного extern для каждой функции-члена.

...