Während versuchen, einen Code zu debuggen, habe ich eine Klasse, um die Werte einer komplizierten Hierarchie von Objekten in eine Textdatei zu entleeren, so dass ich einen Fall vergleichen, wo es gegen einen Fall funktioniert, wo es tut es nicht. Ich implementiert die Klasse wie folgt (auf ein bloßes Beispiel reduziert):automatische Vorlagentyp Abzug verwirrend Zeiger und Referenzen
#include <iostream>
class someOtherClass
{
public:
someOtherClass()
: a(0)
, b(1.0f)
, c(2.0)
{}
int a;
float b;
double c;
};
class logger
{
public:
// Specific case for handling a complex object
logger& operator << (const someOtherClass& rObject)
{
std::cout << rObject.a << std::endl;
std::cout << rObject.b << std::endl;
std::cout << rObject.c << std::endl;
return *this;
}
// [other class specific implementations]
// Template for handling pointers which might be null
template< typename _T >
logger& operator << (const _T* pBar)
{
if (pBar)
{
std::cout << "Pointer handled:" << std::endl;
return *this << *pBar;
}
else
std::cout << "null" << std::endl;
return *this;
}
// Template for handling simple types.
template< typename _T >
logger& operator << (const _T& rBar)
{
std::cout << "Reference: " << rBar << std::endl;
return *this;
}
};
int main(int argc, char* argv[])
{
logger l;
someOtherClass soc;
someOtherClass* pSoc = &soc;
l << soc;
l << pSoc;
pSoc = nullptr;
l << pSoc;
return 0;
}
Ich hatte erwartet, die folgende Ausgabe zu erhalten:
0
1
2
Pointer handled:
0
1
2
null
Aber was ich eigentlich ist:
0
1
2
Reference: 010AF7E4
Reference: 00000000
Der automatische Typabzug scheint die Referenzimplementierung auszuwählen und den Typ auf someOtherClass*
festzulegen, anstatt die Zeigerimplementierung auszuwählen. Ich bin 2012
Sie benötigen einen [MCVE] –
@PasserBy: Die bereitgestellten Code in sich geschlossen ist und reproduziert das Problem – Mat
@Mat Es vollständig und überprüfbar ist, aber nicht minimal. Das hört sich ein wenig wählerisch an, aber ich denke, es hilft, die Zeit für alle Beteiligten zu reduzieren. Der Autor das Problem auf seine minimal reduzieren, ist schneller als andere –