2014-08-27 10 views
15

Ho un metodo di classe che restituisce un riferimento a qualcosa. Quando utilizzo questo metodo, se ho solo una dichiarazione anticipata di quel qualcosa, posso compilare solo se assegno l'output del metodo. Io davvero non capisco perché ...Restituzione di un riferimento a un tipo dichiarato in avanti (C++)

Ecco un esempio semplificato:

ClassA.h:

//Forward declare 
class ClassB; 

class ClassA 
{ 
public: 
    ClassA(void); 
    ~ClassA(void); 

    ClassB& Func(); 
}; 

ClassA.cpp:

#include "ClassA.h" 

#include "ClassB.h" 

ClassA::ClassA(void) 
{} 

ClassA::~ClassA(void) 
{} 

static ClassB c; 

ClassB& ClassA::Func() 
{ 
    return c; 
} 

ClassB.h:

#pragma once 
class ClassB 
{ 
public: 
    ClassB(void) {}; 
    ~ClassB(void) {}; 
}; 

Ora, se io chiamo ClassA::Func senza assegnare il valore di ritorno (mentre solo avere una dichiarazione anticipata di ClassB), non sarà la compilazione:

main.cpp:

#include "ClassA.h" 

int main(void) 
{ 
    ClassA a; 

    a.Func(); //error C2027: use of undefined type 'ClassB' 

    return 0; 
} 

Se uso questa riga, funziona: ClassB& b = a.Func();

Cosa sta succedendo qui? Perché il compilatore deve conoscere la dimensione di ClassB o quali sono i suoi metodi quando il valore di ritorno non viene assegnato da nessuna parte?

Sto compilando questo con VisualStudio 2010 SP1.

+6

Sembra un errore del compilatore, come dici tu non c'è motivo per cui il compilatore debba sapere qualcosa su 'ClassB' per poter scartare il riferimento se non lo si lega a nulla. –

+0

Si può riprodurre anche in VS2012. – dlf

+0

È sia nel debug che nel rilascio? – quantdev

risposta

5

sembra una "limitazione" del compilatore, the MSDN page for C2027 says:

E 'possibile dichiarare un puntatore a un tipo dichiarato, ma non definito. Ma Visual C++ non consente un riferimento a un tipo non definito.

Il seguente esempio genera C2027.

e dà questo esempio:

class A; 
A& CreateA(); 

class B; 
B* CreateB(); 

int main() { 
    CreateA(); // C2027 
    CreateB(); // OK 
} 

Così entrambe le esempi si suppone per generare un C2027, io non sono sicuro perché il secondo non (cioè, senza ulteriore documentazione fa, è un bug)

+0

Eccetto ovviamente, dato che l'errore scompare se viene assegnato il valore di ritorno. ?? – dlf

+0

@dlf Non capisco perché il secondo non genera un errore, ma il codice OP è simile all'esempio MSDN che genera un errore. – quantdev

+0

Sono d'accordo.O la loro documentazione è sbagliata (incompleta), o il fatto che l'altro caso funzioni è un "bug" nel senso che segue lo standard in cui la documentazione dice che non dovrebbe. – dlf

Problemi correlati