Ich habe einig Benutzer definiert Iteratoren, und ab und zu bekomme ich einen seltsamen Fehler, die einfach um zu arbeiten, aber ich verstehe nicht, warum ich es bin immer:Warum wird die Adresse eines Array-Elements manchmal für eine Deklaration gehalten?
uint8_t bytes[pitch*height];
array_iterator::col_iterator a(&bytes[0]);
array_iterator::row_iterator base_iter_begin(
array_iterator::col_iterator(&bytes[0]), width, pitch);
array_iterator::row_iterator base_iter_end(
array_iterator::col_iterator(&bytes[pitch*height]), width, pitch
);
Ich habe eine Klasse namens array_iterator mit eingebetteten typedefs row_iterator und col_iterator. Der row_iterator-Konstruktor verwendet einen col_iterator als erstes Argument. Die erste und letzte Aussage funktioniert gut. Die mittlere Anweisung schlägt mit dem folgenden Fehler zu kompilieren:
test-2d-iterators.cc:780: error: declaration of 'bytes' as array of references
Schreiben & (Byte [0]) nicht das Problem lösen (nicht überraschend, da [] eine höhere Priorität hat als &). Natürlich kann ich einfach "a" für den expliziten Konstruktoraufruf col_iterator ersetzen, aber warum muss ich? Und wenn es ein Problem gibt, warum kompiliert der col_iterator-Konstruktor in der letzten Zeile?
Danke.
Most Vexing Parse vielleicht? –
Geben Sie ein * kurzes * Beispiel ein, das das Problem reproduziert. –
Es könnte die Most Vexing Parse sein, aber ich bin mir nicht sicher. Würde die dritte Zeile nicht auf die gleiche Weise analysiert? static_cast (& bytes [0]) löst das Problem, aber nur Parens um & Bytes [0] hinzufügen nicht. Sorry, das Beispiel ist nicht mehr destilliert, aber das Problem scheint ohne Reim oder Grund zu kommen und zu gehen (d. H. Wie unterscheidet sich die dritte Zeile von der zweiten?), Also hat es meinen Versuchen widerstanden. Es sieht jedoch wie ein Parse-Fehler aus, also würde ich denken, dass es nicht darauf ankommt, was row_iterator oder col_iterator eigentlich sind. –
user1806566