C++ kann keine Templates mit lokalen Typen benutzen

Ein wenig überrascht war ich dann schon, als sich folgendes Code-Fragment mit dem GNU-Compiler nicht übersetzen ließ:

void func()
{
   struct Name
   {
      std::string firstName;
      std::string lastName;
   };
   std::vector names;
}

Die Fehlermeldung heisst "template argument 2 is invalid". Bei Visual c++ 2005 ging das übrigens ohne Probleme. Ob dabei was sinnvolles rauskam, weiss ich aber nicht.

Das zugrundeliegende Problem ist, daß C++ für Templates keine Typen verwenden kann, die in einem lokalen Scope deklariert wurden. Das Ganze ist beschrieben in einem Paper "Making Local Classes more Useful" von Anthony Williams (Doc No: SC22/WG21/N1427=03-0009).

Der Workaround sieht schlichweg so aus, die struct außerhalb von func() zu deklarieren. Man kann noch einen anonymous-Namespace benutzen, damit ist die struct nur in der jeweiligen Datei sichtbar und "verschmutzt" immerhin nicht den globalen Namespace anderer Module:

namespace
{
   // annotate struct name
   // to avoid clashes
   struct func_Name
   {
      std::string firstName;
      std::string lastName;
   };
}
void func()
{
   std::vector names;
}