2016-12-20 5 views
0

Ich habe eine Template-Klasse Array, die ein zweidimensionales Array implementiert. Die Array-Klasse enthält einen überladenen Operator(), die an der auf Null basierende Position einen Verweis auf das Element zurückkehrt (Spalte x, Reihe y):Ausdruck muss ein modifizierbarer Wert sein: `(x, y) = 0;`

const T & operator() (int x, int y) const { 
     size_t loc = y*width + x; 
     return *(buffer + loc); 
    } 

Ich habe auch ein Klassenbild abgeleitet ist, die einen generischen Datencontainer darstellt für eine Bildklasse Bildes.Verfahren ppm enthält eine setPixel Methode, die die RGB-Werte für einen (x, y) Pixelsätze:

void setPixel(unsigned int x, unsigned int y) {  
      size_t locpixel = y*width + x; 
      size_t componentofpixel = locpixel * 3; 
      (x, y) = 0; 
      (x, y) + 1 = 1; 
      (x, y) + 2 = 0; 
    } 

wenn ich also kompilieren es zeigt einen Fehler in setPixel daß der Ausdruck eine modifizierbar sein muß lWert. Gibt es eine Möglichkeit, den Operator() in meiner setPixel-Methode zu verwenden, um das nächste Element auf dem Array zu nehmen?

+0

Erwarten Sie, dass '(x, y)' Ihren 'operator()' aufruft? – NathanOliver

+0

Das ist was ich versuche zu tun –

+1

Sie benötigen eine Instanz, um den Operator anzurufen. versuchen Sie '(* das) (x, y) ...' – NathanOliver

Antwort

0

Im Gegensatz zu einer Elementfunktion benötigt ein Operator eine Instanz, um verwendet werden zu können. Gerade jetzt, wenn Sie (x, y) tun, rufen Sie den Komma-Operator und der Compiler wertet den Ausdruck x, verwirft es und wertet dann den Ausdruck y und gibt zurück, was das ergibt. Diese Rückgabe ist ein temporärer Wert, den Sie nicht zuweisen können, da es sich um einen eingebauten Int-Typ handelt.

Um den Funktionsaufruf-Operator aufzurufen, müssen Sie ihm eine Instanz geben, über die er aufgerufen werden kann. In diesem Fall können Sie

(*this)(x, y) = 0; 
(*this)(x, y) + 1 = 1; 
(*this)(x, y) + 2 = 0; 

verwenden Dies wird zu fordern nun beschlossen die operator() Sie haben für den Typ definiert.

Verwandte Themen