2016-05-03 5 views
0

Ich bringe hier 3 Versionen von Code, der erste verursacht einen Kompilierungsfehler, der zweite und der dritte wurden erfolgreich kompiliert.Fehler: verschachtelte Klasse in einer geschachtelten Klasse in einer Template-Klasse "ist kein Typ"


Code 1:

Ich habe Klasse Bottom eine verschachtelte Klasse in Middle ist, die eine verschachtelte Klasse in einer Template-Klasse ist Top

template <class> 
struct Top { 
    struct Middle { 
     struct Bottom {}; 
    }; 
    void useclass(Middle::Bottom); 
}; 

Dieser Code gibt einen Fehler:

main.cpp:6:27: error: 'Top::Middle::Bottom' is not a type 
void useclass(Middle::Bottom); 
        ^

Code 2:

ähnlich Code 1 aber mit Top ist eine normale Klasse (nicht Vorlage)

struct Top { 
    struct Middle { 
     struct Bottom {}; 
    }; 
    void useclass(Middle::Bottom); 
}; 

Dieser Code erfolgreich ohne Fehler

Code 3 zusammengestellt wurde:

ähnlich Code 1 aber mit Methode useclass unter Middle statt Bottom

template <class> 
struct Top { 
    struct Middle { 
     struct Bottom {}; 
    }; 
    void useclass(Middle); 
}; 

Dieser Code wurde erfolgreich als auch kompilierte


Bitte sagen Sie mir:

  • Warum 1-Code kann nicht kompiliert werden zusammengestellt, die Regel von C++ verhindert, dass es zu werden?

  • Gibt es eine Möglichkeit eine verschachtelte Klasse in einer verschachtelten Klasse in einer Template-Klasse zu verwenden wie Bottom als eine Art?

+0

@PeteBecker Ich aktualisierte, danke! – DMaster

+0

@ M.M Nicht einmal das. Es ist ein Betrüger von http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and-typename-keywords – NathanOliver

+0

@NathanOliver welcher Teil dieses Codes erklärt die Situation von OP genau? Es ist mir nicht klar –

Antwort

1

ich firgured es einfach aus, ich brauche typename vor Middle::Bottom in Code 1 und es erfolgreich kompiliert werden würde zu platzieren.

template <class> 
struct Top { 
    struct Middle { 
     struct Bottom {}; 
    }; 
    void useclass(typename Middle::Bottom); 
}; 

P.S. Ich erwarte noch einige Antworten mit mehr Details, z.B. Warum erkennt Compiler nicht Middle::Bottom als ein Typ ohne ein Schlüsselwort typename?

Verwandte Themen