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.
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. –
Si può riprodurre anche in VS2012. – dlf
È sia nel debug che nel rilascio? – quantdev