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::vectornames; }
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::vectornames; }