См. GOTW # 58 - вы не можете использовать локально определенные классы в качестве аргументов для шаблонных типов, например, вектор не допускается.
Из стандарта C ++ (14.3.1 / 2):
A local type, a type with no linkage, an unnamed
type or a type compounded from any of these types
shall not be used as a template-argument for a
template type-parameter. [Example:
template <class T>
class X { /* ... */ };
void f()
{
struct S { /* ... */ };
X<S> x3; // error: local type used as
// template-argument
X<S*> x4; // error: pointer to local type
// used as template-argument
}
--end example]
Хотя я не читаю это как значение шаблонных функций, таких как std :: sort, не может использовать локальный класс в качестве аргумента, очевидно, gcc думает иначе.
Локальные классы не имеют связи (без глобального имени), что похоже на то, что помогает перегореть писателям компиляторов и вредит реальным программистам. Чтобы фактически разрешить использование локального класса S в vector<S>
или некотором function<..,S>
, я предполагаю, что сгенерированному объекту понадобится уникальное глобальное имя.