В стандарте языка С++ указано следующее относительно компонентов шаблона в стандартной библиотеке:
Эффекты undefined... если неполный тип используется в качестве аргумента шаблона при создании экземпляра компонента шаблона, если это специально не разрешено для этого компонента (С++ 11 §17.6.4.8/2).
Является ли следующее создание экземпляра шаблона класса std::vector?
class X;
std::vector<X> f(); // Declaration only; we will define it when X is complete
Чтобы спросить об этом по-другому, в объявлении функции std::vector<X> f();, есть std::vector, созданный с аргументом X? Или, std::vector<X> не создается, пока f() не используется или не определено?
Аналогично, вызывает ли следующая процедура создания шаблона класса std::vector?
class X;
typedef std::vector<X> XVector; // We will complete X before we use XVector
Пока я использую std::vector в этих примерах, вопрос одинаково применим ко всем шаблонам.