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

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

 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() {}
     };
 }

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам