Warum verursacht die zweimalige Verwendung dieser C ++ - Funktion in einer Zeile einen Kompilierungsfehler?
Bei dem Versuch, eine Vorlagenfunktion vom Typ "Smart Equality Test" in Visual C ++ 2010 zu implementieren, die mit a zu tun hatte, gab es einige ProblemeFehler in VS in Bezug auf Standardargumente von Template-Funktionen. Ich habe es behoben, indem ich den Wert des Parameters in eine zusätzliche Funktion eingewickelt habe, aber jetzt habe ich festgestellt, dass ich die Funktion nicht zweimal in einer Zeile verwenden kann!
Header-Datei:
<code>// example.h #pragma once #include <limits> namespace myspace { // Need to define this separately to avoid a Visual Studio bug template<typename T> T epsilon() { return std::numeric_limits<T>::epsilon(); } // A generic equality test template<typename T> inline bool smartEqual( const T &v1, const T &v2, const T &eps = epsilon<T>()) { return (v1 == v2); } // Template specialization for floating-point numbers template<> bool smartEqual<float>( const float &v1, const float &v2, const float &eps); } // namespace myspace </code>
Quelldatei:
<code>// example.cpp #include "example.h" using namespace std; using namespace myspace; // equal-macro specialization for floats using epsilon template<> bool myspace::smartEqual<float>( const float &v1, const float &v2, const float &eps) { return (fabs(v1 - v2) < eps); } int _tmain(int argc, _TCHAR* argv[]) { float a,b; bool x = smartEqual(a,b); // works ok bool x = smartEqual(a,b) && smartEqual(b,a); // error return 0; } </code>
Der Fehler wird wie folgt gemeldet:
------ Build gestartet: Projekt: Test, Konfiguration: Debug Win32 ------
test.cpp
c: \ users \ ninja \ documents \ visual studio 2010 \ projects \ test \ test \ test.cpp (24): Fehler C2440: 'Standardargument': Konvertierung von 'const float *' in 'const float &' nicht möglich
Grund: Konnte nicht von 'const float *' in 'const float' konvertieren
Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
In der betreffenden Zeile versuche ich, smartEqual () zweimal mit dem logischen UND aufzurufen.
Ich verstehe nicht, warum das passiert. Das Ändern von "eps" von einem Referenztyp in einen einfachen Werttyp behebt das Problem, aber ich wünschte, ich wüsste, was los ist.
Vielen Dank!