FAQ001: modern102.cpp compiliert nicht auf Microsoft Visual Studion 2012
FAQ
Habe soweit das Programm modern102.cpp in Visual Studio 2012 übernommen. Wenn ich das Prgramm ausführen lassen möchte, bekomme ich als Fehlermeldung:
error C2601: ‘table’: Lokale Funktionsdefinitionen sind unzulässig
Mir wird genau an der Stelle:
…static std::map\<int, int> table{};…
bei der geschweiften Klammer angezeigt, dass was nicht stimmt. Bei genaueren Hinsehen in Ihrem Buch, stehen unter den beiden geschweiften Klammern {} jeweils ein Punkt.
Das klingt sehr danach, dass der Compiler C++11-Konstrukte zurückweist.
Hier sehen Sie
- http://msdn.microsoft.com/de-de/library/hh567368.aspx
- http://msdn.microsoft.com/en-us/library/hh567368.aspx
- http://msdn.microsoft.com/en-us/library/vstudio/hh567368(v=vs.110).aspx
dass “Visual Studio 2012” zum Beispiel die “Initializer Lists” nicht kennt, also die
Initialisierung mit “{…}”. Das ist hier das Problem.
Im Anhang können Sie alternative Schreibweisen für C++11-Konstrukte finden, die Ihr Compiler nicht kennt. Konkret schreiben Sie statt
static std::map<int, int> table{};
in MSVC2012:
static std::map<int, int> table;
Wenn Sie die Möglichkeit haben, sollten Sie auf die neueste Version von Visual Studio wechseln. Wenn nicht, müssen Sie teilweise auf alternative Schreibweisen ausweichen.
Möglicherweise hilft auch ein kleines Update, das habe ich aber nicht selbst probiert.
In early November 2012, Microsoft announced the Visual C++ Compiler November 2012 CTP, which adds more C++11 functionality to Visual Studio 2012.
Im buch können Sie Punkte unter den Klammern sehen, die auf ein C++11-Feature hindeuten (wird in Abschnitt 1.2, “Verwendete Formatierungen”, S. 27, eingeführt). Wenn an solchen Stellen etwas schief geht und der Compiler meckert, sollten Sie skeptisch werden. Hier ist die “Initialisierungsliste” gepunktet unterstrichen – weil “{}” so wenig Text ist, erschient diese Linie als nur zwei Punkte.