Шаблон участника в местном классе
Учитывая следующий код:
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: внутренняя ошибка компилятора ^^.