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