Шаблон участника в локальном классе

С учетом следующего кода:

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

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

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

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

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

Я получаю "ошибку: объявление шаблона не может появляться в области блока".

Ответ 1

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

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

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