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!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage