Шаблон участника в местном классе - PullRequest
45 голосов
/ 29 ноября 2010

Учитывая следующий код:

 void f()
 {
     class A
     {
         template <typename T>
         void g() {}
     };
 }

g ++ 4.4 (а также g++-4.6 -std=gnu++0x) жалуется: "недопустимое объявление шаблона элемента в локальном классе".

Видимо, локальные классыразрешено иметь членов шаблона.Какова цель этого ограничения?Будет ли он удален в C ++ 0x?

Примечание. Если я сделаю сам локальный класс шаблоном, а не предоставлю ему элемент шаблона:

 void f()
 {
     template <typename T>         
     class A
     {
         void g() {}
     };
 }

I get "error:объявление шаблона не может появляться в области видимости блока ".

1 Ответ

11 голосов
/ 08 декабря 2010

Цель этого ограничения?Просто предположение, но:

  • вы можете использовать функцию класса шаблона / шаблона только в пределах функции включения.Поэтому вы уже знаете все используемые типы в функции и, следовательно, можете напрямую указать используемые типы (для нескольких типов, конечно, вариант шаблона сохранил бы некоторую типизацию).
  • , хотя это может показаться не так, этоэто работа для всех создателей компилятора и место для ошибок, поэтому оно должно стоить усилий.

Интересный факт: попробуйте использовать локальный класс внутри функции в качестве возвращаемого типа для (c ++0x) функция -lambda, объявленная в функции: MSVC 2010: внутренняя ошибка компилятора ^^.

...