2014-10-19 13 views
8

Ich habe zwei öffentliche Klassen; eine statische (DesktopOps), eine nicht-statische (Args), und ich versuche, die statischen Variablen der statischen Klasse in main zu initialisieren.Qualified-ID in der Deklaration vor '=' Token

Die Fehlermeldung, die ich immer halten ist:

main.cpp:25: error: qualified-id in declaration before '=' token 
    Point DesktopOps::window_coords = Point(arg.topleft_x, arg.topleft_y); 
            ^
main.cpp:26: error: qualified-id in declaration before '=' token 
    Point DesktopOps::window_dims = Point(arg.width, arg.height); 
           ^

hier ein MWE:

#include <opencv2/opencv.hpp> 

using namespace cv; 

struct Args{ 
    int topleft_x, topleft_y, width, height; 

    Args(){ 
     topleft_x = topleft_y = width = height = -1; 
    } 
}; 


struct DesktopOps { 
    static Point window_coords; 
    static Point window_dims; 

}; 



int main(){ 
    Args arg(); 

    Point DesktopOps::window_coords = Point(arg.topleft_x, arg.topleft_y); 
    Point DesktopOps::window_dims = Point(arg.width, arg.height); 
} 

Antwort

12

Ich verstehe nicht wirklich, was Sie zu tun versuchen .... aber statische Variablen müssen in globalen Bereich geschaffen werden, außerhalb der Hauptfunktion:

Args arg; 
Point DesktopOps::window_coords = Point(arg.topleft_x, arg.topleft_y); 
Point DesktopOps::window_dims = Point(arg.width, arg.height); 

int main(){ 

} 

Aber dieser globale Args Variable macht keinen Sinn ....

+0

Ich fühle mich wie ein Idiot, weil ich nicht weiß, dass Statik global deklariert werden muss (wie sonst werden alle Mitglieder es sehen, Doy), aber welche Variable macht keinen Sinn? (Ich habe eine Menge Zwischencode gelöscht btw) – tetris11

+1

Ich meine, dass eine globale Args-Variable mit default ctor zu deklarieren, nur um die Mitglieder in statischen window_coords und window_dims Initialisierung zu verwenden, behebt nur Ihren Kompilierungsfehler, aber ist eine sehr hässliche Art, es zu tun. ... Ich bin sicher, dass du deinen Code besser anordnen wirst. – jpo38

+0

gut ... hier ist das Ding, Arg acually nimmt als '(int argc, char arv ***)' als Argumente, so muss es innerhalb der Haupt sein .... aber ich werde etwas herausfinden – tetris11

6

In der Struktur, die Sie die Elementvariablen deklarieren , aber wenn man sie definieren können Sie t tun es in einer Funktion, muss es im globalen Bereich, wie

struct DesktopOps { 
    static Point window_coords; 
    static Point window_dims; 
}; 

Point DesktopOps::window_coords = Point(someX, someY); 
Point DesktopOps::window_dims = Point(someW, someH); 

int main() 
{ 
    // ... 
} 
getan werden

Leider kann dies nicht durchgeführt werden, da die Initialisierung von der lokalen Variable in der main Funktion abhängt. Das heißt, Sie haben die Definition und die Initialisierung in zwei Schritten vor:

struct DesktopOps { 
    static Point window_coords; 
    static Point window_dims; 
}; 

Point DesktopOps::window_coords; 
Point DesktopOps::window_dims; 

int main() 
{ 
    Args arg; 

    DesktopOps::window_coords = Point(arg.topleft_x, arg.topleft_y); 
    DesktopOps::window_dims = Point(arg.width, arg.height); 
} 
+0

wow, links ein Sandwich zu machen und kam mit einer kurzen und informativen Lösung. Ich verstehe jetzt, obwohl ich nicht verstehe, warum das notwendig ist; Warum macht der Compiler das nicht einfach für mich? – tetris11

+1

Ist das nicht 'Arg arg() 'eine Funktionsdeklaration? – Mat

+0

ist der Konstruktor initialisiert auf die Variable 'arg', nein? – tetris11

Verwandte Themen