3

ich dieses Problem haben ...C++ statische Methode mit struct parametrs

ich eine meiner Struktur haben:

typedef struct Mystruct{ 
    float a; 
    float b; 
} 

und eine statische Methode:

float static MyStaticMethod(MyStruct a, MyStruct b); 

, wenn ich diese Methode aufrufen :

Mystruct s; 
s.a = 1; 
s.b = 2; 

Mystruct t; 
t.a = 1; 
t.b = 2; 

MyClass.MyStaticMethod(s,t); 

ich habe diesen Fehler bei c ompile Zeit:

Error 51 error C2228: left of '.MyStaticMethod' must have class/struct/union 

Error 50 error C2275: 'MyClass' : illegal use of this type as an expression 
+1

Die Verwendung von 'typedef' in der Definition von' Mystruct' ist nutzlos. Ich würde empfehlen, dass Sie es entfernen, aber wenn Sie wirklich die * kleine * Differenz benötigen, die es in C++ macht, müssen Sie einen Namen für das typedef 'typedef struct MyStruct {..} MyStruct;' angeben. Wieder würde ich es einfach fallen lassen. Mehr [hier] (http: // stackoverflow.com/a/1675446/36565), beachten Sie, dass selbst wenn der Hauptfokus C ist, die Antwort auch C++ behandelt –

Antwort

9

Sie müssen es nennen einen Bereichsauflösungsoperator:

MyClass::MyStaticMethod(s,t); 
     ^^ 
1

außer mit "MyClass :: MyStaticMethod (s, t);", könnte man auch den statischen Aufruf Methode auf einer Instanz:

MyClass instance; 
instance.MyStaticMethod(s,t); 

und es sollte lauten:

typedef struct { 
    float a; 
    float b; 
} Mystruct; 

(der neue Type-Name kommt zuletzt) ​​

1

Das Schlüsselwort static in der C++ Sprache überlastet ist (d.h. es hat mehrere Bedeutungen). In dem Code, den Sie präsentiert:

struct MyStruct { 
}; 
static float MyStaticFunction(MyStruct, MyStruct); 

die Bedeutung von static ist interne Bindung (dh das Symbol nicht nutzbar außerhalb der aktuellen Übersetzungseinheit wird, wenn diese in einem Header vorhanden ist, dann von denen jede Übersetzung. Gerät seine eigene Kopie der Funktion erhalten in diesem Fall Nutzung ist die einer Freisprechfunktion.

MyStruct a,b; 
float f = MyStaticFunction(a, b); 

aus dem Versuch scheint es zu benutzen, dass das, was Sie gemeint war static in diesem alternativen Szenario mit:

struct MyStruct { 
    static float MyStaticFunction(MyStruct, MyStruct); 
}; 

wo es eine andere Bedeutung hat: das Mitglied gehört zu der Klasse, nicht zu einer bestimmten Instanz. In diesem Fall kann die Funktion in einer von zwei Möglichkeiten genannt werden, die häufigste ist:

MyStruct a,b; 
float f = MyStruct::MyStaticFunction(a, b); 

obwohl auch die Sprache erlaubt (ich würde es nicht empfehlen, verwenden, kann es verwirrend sein):

float f a.MyStaticFunction(a,b); 

Wo die Verwirrung entsteht, weil es wie ein Aufruf Mitglied Funktion auf a sieht, anstatt eine statisches Element Funktion auf der Klasse aufrufen.