Подтвердить что ты не робот

Локальный тип в качестве аргументов шаблона в С++

Это мой код

#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. Как этот код может работать?

4b9b3361

Ответ 1

В какой части стандарта говорится, что это неправильно?

Это будет §14.3.1/2 из стандарта С++ 2003 года:

Локальный тип, тип без привязки, неназванный тип или тип, составленный из любого из этих типов, не должны использоваться как шаблон-аргумент для параметра типа шаблона.


Как заставить этот код работать?

Не используйте локальный тип в качестве аргумента шаблона.

Обратите внимание, что это ограничение было снято в С++ 11, поэтому, используя этот языковой стандарт, вы можете использовать локальный тип в качестве аргумента шаблона.

Ответ 2

14.3.1/2

Локальный тип, тип без привязки, неназванный тип или тип, составленный из любого из этих типов, не должны использоваться как шаблон-аргумент для параметра типа шаблона.

Попробуйте выполнить компиляцию кода с помощью опции -std=c++0x (gcc 4.5.1). С++ 0x отменяет ограничение и поэтому вы можете использовать локальный тип в качестве аргумента шаблона.