Локальный тип в качестве аргументов шаблона в С++
Это мой код
#include <vector>
template <typename T, template<typename> class C = std::vector >
struct FooBar
{
/*codez*/
};
template<typename T>
struct Global{};
int main()
{
struct Local{};
FooBar<Local,Global> k;
}
Это ошибка, которую я получаю
template argument for ‘template<class T, template<class> class C> struct FooBar’ uses local type ‘main()::Local’
Какая часть стандарта говорит, что это неправильно? Я использую gcc 4.5.1. Как этот код может работать?
Ответы
Ответ 1
В какой части стандарта говорится, что это неправильно?
Это будет §14.3.1/2 из стандарта С++ 2003 года:
Локальный тип, тип без привязки, неназванный тип или тип, составленный из любого из этих типов, не должны использоваться как шаблон-аргумент для параметра типа шаблона.
Как заставить этот код работать?
Не используйте локальный тип в качестве аргумента шаблона.
Обратите внимание, что это ограничение было снято в С++ 11, поэтому, используя этот языковой стандарт, вы можете использовать локальный тип в качестве аргумента шаблона.
Ответ 2
14.3.1/2
Локальный тип, тип без привязки, неназванный тип или тип, составленный из любого из этих типов, не должны использоваться как шаблон-аргумент для параметра типа шаблона.
Попробуйте выполнить компиляцию кода с помощью опции -std=c++0x
(gcc 4.5.1). С++ 0x отменяет ограничение и поэтому вы можете использовать локальный тип в качестве аргумента шаблона.