2016-11-19 2 views
2

Wie kann der automatische Typabzug für die Klassenmitglieder verwendet werden? Zum Beispiel den folgenden Code`auto` Rückgabetyp im Kontext von Klassenmitgliedern

struct A 
{ 
    auto foo(); // foo is defined in another file 
}; 


int main() 
{ 
    A a; 
    a.foo(); 
} 

wo foo den Rückgabetyp auto Ergebnisse in der folgenden Fehler hat:

error: function 'foo' with deduced return type cannot be used before it is defined 
    a.foo(); 
    ^

Der Fehler ist verständlich, da die Kompilierung kann nicht wissen, was foo ‚s Rückgabetyp ohne ist seine Definition kennen.

Meine Frage ist, wenn es eine Problemumgehung oder irgendeine Art von Programmiermuster gibt, um das Problem zu umgehen, dass automatische Rückgabetyp nicht für Klassenmember Funktionen verwendet werden kann, falls die Erklärung und Definition der Funktion getrennt ist.

+3

Nein. Wenn Sie Rückgabetypabzug verwenden, muss die Definition ** sichtbar sein **, bevor Sie die Funktion (Element) verwenden können. – ildjarn

+3

Sie können die Deklaration und Definition der Funktion trennen. Die Definition muss jedoch sichtbar sein, bevor die Funktion verwendet wird. – krzaq

+3

Sie brauchen hier keine "Abhilfe", da es kein Problem gibt, das gelöst werden muss. Benutze 'auto' einfach nicht so. –

Antwort

5

Wenn Sie die Rückgabetypableitung verwenden möchten, können Sie die Deklaration und Definition nicht in verschiedene Dateien aufteilen (es sei denn, alle enthalten beides). Es gibt keine Problemumgehung dafür, als einen tatsächlichen Typ zu verwenden.

Wenn C++ kompiliert Code, der func aufruft, muss es zu dieser Zeit wissen, was es zurückgeben wird. Ohne Definition in dieser Übersetzungseinheit kann der Compiler nicht wissen, was zurückgegeben wird. Daher kann der Compiler diesen Code nicht kompilieren. Und das C++ - Kompilierungsmodell erlaubt es nicht, Informationen von anderen Übersetzungseinheiten auf diese Weise zu verwenden.

Das Beste, was Sie tun können, ist warten auf Module, die in der Lage sein, dies zu umgehen.

Denken Sie nicht an Rückgabetyp Abzug als eine Möglichkeit, nie Rückgabetypen schreiben müssen. Es ist eine Funktion, die für Situationen vorgesehen ist, in denen der Rückgabetyp unhandlich zu schreiben ist, wobei der vernünftigste Weg zum Schreiben der decltype(expr) ist und expr der exakte Ausdruck ist, den Sie zurückgeben werden. Und diese Fälle sind in der Regel im Template-Code, der sowieso in Header gehen muss. Wenn der Rückgabetyp einfach und für Sie offensichtlich ist, gibt es wirklich wenig Grund nicht, um es dort zu setzen. Verwenden Sie nicht standardmäßig den Rückgabetypabzug.

Verwandte Themen