2014-04-05 20 views
5

Mein Problem ist, dass ich zuerst meine Schnittstelle definieren und dann weiter im Code implementieren muss, aber mein Problem, dass die Funktion, die innerhalb der Klasse zurückgegeben werden sollte, außerhalb der Klasse unbekannt zu sein scheint Ich implementiere Methode.Unbekannter Rückgabetyp Fehler (C++)

Dies ist mein Code:

class Test { 
    class Inner { 
    };  
public:  
    Inner* foo (void); 
}; 

Inner* Test::foo(){ 
} 

Dieser Code erzeugen Fehler, da Typ Inner außerhalb der Klasse unbekannt für die Funktion ist. Kann jemand mir helfen, einfache Funktion zu machen, die den nur innerhalb der Klasse definierten Typ zurückgeben würde?

Vielen Dank für jede Hilfe.

+3

Test :: Inner * Test :: foo() –

Antwort

3

Inner ist eine verschachtelte Klasse und außerhalb Klasse Test es voll qualifiziert sein muss:

Test::Inner* Test::foo() { 
    //... 
} 

weil in globalem Bereich Inner in der Tat nicht bekannt ist, nur Test::Inner, so ein Inner innerhalb Test bekannt ist. Sie könnten auch einen anderen Inner im globalen Bereich haben, genauso wie mit Test, und dies wird andere Inner, nicht Test::Inner sein.

6

Sie benötigen

Test::Inner* Test::foo(){ 

}

Wenn eine Funktionsdefinition außerhalb der Klassendefinition ist, dann ist der Rückgabetyp nicht im Klassenbereich ist, im Gegensatz zum Rest der Funktion , also müssen Sie den Rückgabetyp explizit qualifizieren.

3

Sie scheinen den Umfang nicht anzugeben, so dass er natürlich unbekannt bleibt. Der C++ - Compiler sucht nach einer Inner-Klasse außerhalb Ihrer Test-Klasse, die auch als eine andere Klasse angezeigt werden könnte, aber in Ihrem speziellen Fall nicht.

Deshalb müssen Sie auch den Umfang angeben, auch für den Rückgabetyp. Das heißt nicht, dass Sie den Bereich innerhalb Ihrer Testklasse verwenden müssten, aber außerhalb müssen Sie dies tun.

Dadurch wird der richtige Code würde wie folgt sein:

class Test { 
    class Inner { 
    };  
public:  
    Inner* foo (void); 
}; 

Test::Inner* Test::foo(){ 
//^^^^ 
} 

Streng genommen, wenn Sie einen aktuellen Compiler haben, könnten Sie sogar Auto benutzen, aber dann wird es ein bisschen weniger umfassend.

2
class Test { 
class Inner { 
};  
public:  
    Inner* foo (void); 
}; 

Test::Inner* Test::foo(){ 
} 
5

Da niemand erwähnt hat, können Sie C++ 11 tun dies auch in:

auto Test::foo() -> Inner * {...} 

Dies kann nützlich sein, wenn der vollständige Name lang ist. In C++ 14 können Sie den nacheilenden Typ abbrechen und einfach tun:

Dies wird den Rückgabetyp ableiten.