Newsgroup: it.comp.lang.c++
Titolo: Compilatore stupido.

Credo di trovarmi di fronte ad un caso di compilatore stupido.
Uso il VC++5.0 ed ho due funzioni praticamente identiche'
State& Sprite::GetStateByName(const char * name)
{
	StateVectorIt sIt;	//Iteratore vector di State
	for(sIt = m_States.begin(); sIt != m_States.end(); sIt++)
		if(sIt->GetDescrizione() == name) break;
 
	return sIt==m_States.end()?NULL:*sIt;
}
View& State::GetViewByName(const char * name)
{
	ViewVectorIt vIt;	//Iteratore vector di View
	for(vIt = m_Views.begin(); vIt != m_Views.end(); vIt++)
		if(vIt->GetDescrizione() == name) break;
 
	return vIt==m_Views.end()?NULL:*vIt;
}
appartenenti a due classi diverse (State e Sprite).
Se compilo la prima il compilatore giustamente mi dice:
C:\Fatti di Stefano\c++\stl\spriter\Sprite.cpp(189) : error C2445: '?' :
no common type for 'const int' and 'class State'
                                                                   No
constructor could take the source type, or constructor overload
resolution was ambiguous
C:\Fatti di Stefano\c++\stl\spriter\Sprite.cpp(189) : error C2440:
'return' : cannot convert from 'int' to 'class State &'
                                                                   A
reference that is not to 'const' cannot be bound to a non-lvalue
C:\Fatti di Stefano\c++\stl\spriter\Sprite.cpp(190) : error C2561:
'GetStateByName' : function must return a value
Se invece compilo la seconda classe, mi crea il file OBJ senza darmi 
nemmeno un warning.
Dovo sta' l'errore (o l'eventuale bug di VC++)?
-- 
*******************************************
Pagghiu-Stefano Cristiano
Java and C++ programmer
E-mail: 
spag...@tin.it
 ITALY
*******************************************

Dovo sta' l'errore (o l'eventuale bug di VC++)?
Presumibilmente, la classe View HA un costruttore che
accetta un int, o un qualche tipo di puntatore (NULL, che
deve essere definito a 0, e` accettabile come puntatore
oltre che come intero), o un qualsiasi altro tipo che si
puo` ottenere da int, o da un puntatore, attraverso una
promotion o standard-conversion.
Nessuna ragione, sin qui, di sospettare bug nel compilatore;
bisogna vedere la panoplia dei costruttori di View!
Le funzioni sono invece _certamente_ mal progettate per
un verso o per l'altro.  Una reference va usata tutte E SOLE
le volte che l'oggetto cui si fa riferimento e` *sempre
presente e immutabile dopo l'inizializzazione* (nel senso
che il riferimento non e` MAI a "nessun oggetto", e, una
volta determinato a quale oggetto e`, non cambia la
determinazione di "quale oggetto").  Se, in queste funzioni,
c'e` la possibilita` di dover tornare "nessun oggetto",
allora non e` buon progetto far loro tornare un reference;
o, in alternativa, esse dovrebbero sollevare un'exception
se non sono in grado di determinare il referene da tornare.
Non esiste un "reference nullo", in C++; se vuoi la
possibilita` di "nullita`", devi usare puntatori, non
reference.  Se dereferenziassi quei NULL, non avresti
un programma corretto (anche con tutti i cast del
mondo, tali da lasciarlo compilare), bensi` un caso
di "undefined behaviour", cioe` un programma che, a
norma di standard, puo` fare DI TUTTO, dal format
del tuo hard disk alla spedizione di mail minatorie a
tuo nome al capo della Polizia...!-)
Alex