Denkblockade bei Templates

Cromon

Erfahrenes Mitglied
Hallo zusammen

Wie der Titel erwähnt habe ich eine kleine Denkblockade bei einer meiner Templateklassen zur automatischen Speicherverwaltung.

Code:
template<class T>
template<typename R>
GCP<T>::GCP(GCP<R>& ref)
{
	if(&ref == this)
		return;

	this->m_pMemory = (T*)ref.GetPtr();
	this->m_arraySize = ref.GetArraySize();
	if(m_pMemory)
		GC.IncRev(this);
}

Dieser Code lässt sich nicht compilieren. Der Compiler meldet folgendes Problem:
Code:
error C2446: '==' : no conversion from 'GCP<T> *const ' to 'GCP<T> *'

Warum können nicht zwei Zeiger auf ihre Gleichheit überprüft werden? Muss ich das wirklich in einen Zeiger wie (void*) casten um den Vergleich durchzuführen?

Irgendwie leuchtet das mir nicht ein...

Gruss
Cromon
 
Steht doch da, warum er meckert ;)
const (&ref) kann nicht mit "nicht const" (this) verglichen werden.

Vielleicht hilft ein const_cast auf &ref? Wäre zumindest das erste, was ich probieren würde.
 
Ja, dass es nicht verglichen werden kann sehe ich schon, aber den Grund sehe ich nicht. Die Prüfung auf Gleichheit änder ja an der Konstanz beider Operanden nichts.
 
Würde mal darauf tippen, dass der Vergleichsoperator nur für "nicht const" vorhanden ist. Soweit ich weiß, kann man "nicht const" in on-the-fly nach const convertieren, nicht aber umgekehrt.
 
Hi!

Code:
error C2446: '==' : no conversion from 'GCP<T> *const ' to 'GCP<T> *'

Das Schlüsselwort const nacht dem Asterisk (*) bedeutet nicht dass GCP<T> bzw. ref konstant ist, sondern der Pointer selbst. Aber hier liegt auch nicht dass Problem:
Die Fehlermeldung gibt zwar zwei mal GCP<T> an, doch genau betrachtet muss man sie so verstehen:

Code:
error C2446: '==' : no conversion from 'GCP<R> *const ' to 'GCP<T> *'

GCP<typename R> und GCP<class T> sind zwei verschiedene Kassen! Solange kein Vergleichsoperator für deren Pointer definiert wurde wird der Compiler immer ohne einen Cast immer meckern.

Gruß
Enum
 
Das war mir auch bewusst, dass die nicht identisch sind, aber hätte schwören können, dass Vergleiche von zeigern egal welchen Typs untereinander bis jetzt immer funktioniert haben. Aber wie ich mir grad selbst nochmals vor Augen geführt habe ist das wirklich nicht so. So kann man sich täuschen :P
 
Zurück