Werttypen für Maps müssen standardmäßig konstruierbar sein und einen Ausdruck value_type()
verwenden, um über []
darauf zugreifen zu können. Aus irgendeinem mysteriösen Grund sind Array-Typen nicht, wie in C ++ 11 5.3.2 / 2 spezifiziert (mit meiner Betonung):
Der Ausdruck T (), wobei T ein einfacher Typ-Specifier oder Typname-Specifier für einen non-array complete-Objekttyp ist, ... erzeugt einen prvalue des angegebenen Typs Wert initialisiert
Der Compiler gibt diesen seltsamen Fehler beim Versuch, ein Array zu value-initialisieren. Das folgende gibt den gleichen Fehler:
%Vor% Ich schlage vor, eine Klasse anstelle von double[2]
: std::array<double,2>
, std::pair<double,double>
oder eine struct
mit zwei Doppelpunkten zu verwenden. Solche Typen sind kopierbar, zerfallen nicht in einen Zeiger (sie verlieren ihre Kenntnisse über die Größe der Kompilierung) und sind im Allgemeinen einfacher zu handhaben als ein eingebauter Array-Typ.
Wenn Sie an einer alten Bibliothek festhalten, die std::array
nicht zur Verfügung stellt, können Sie die sehr ähnliche Boost.Array , oder schreiben Sie Ihre eigene einfache Klassenvorlage, um ein Array zu umbrechen.
Dein Code kompiliert bis:
%Vor% weil double[2]
ein gültiger Typ ist. Sie können ein Vorlagenklassenobjekt mit einem beliebigen gültigen Typ deklarieren. Zum Beispiel:
wird ohne Probleme kompiliert.
Wenn Sie x.foo()
aufrufen, wird sich der Compiler darüber beschweren.
Dasselbe passiert im Fall von std::map
. Wenn Sie Funktionen wie map::insert()
, map::operator []
aufrufen, bei denen der Werttyp double[2]
tatsächlich verwendet wird, beginnt der Compiler mit der Reklamation, da double[2]
nicht kopierbar ist ( Ausnahme : I habe eine alte Version von g ++ 3.x gesehen, wo Arrays zuweisbar und kopierbar waren).
Sie können Ihr Array in eine Struktur kapseln.
%Vor% Wenn Sie die Verwendung von RAW-Arrays vermeiden möchten, ist std::array
eine gute Option, wie in Kommentaren und anderen Antworten erwähnt.
Sie können ein Array umbrechen:
%Vor% Live-Beispiel . Sonst, wenn Sie C ++ 11 haben, sollten Sie std::array
; Wenn nicht, und Sie Boost haben, können Sie Boost.Array verwenden.