Dlaczego użycie tej funkcji C ++ dwukrotnie w jednej linii powoduje błąd kompilacji?

Wystąpił problem z implementacją funkcji szablonu typu makra w Visual C ++ 2010, która miała związek zbłąd w VS w odniesieniu do domyślnych argumentów funkcji szablonu. Naprawiłem to, zawijając wartość parametru w dodatkową funkcję, ale teraz odkryłem, że nie mogę użyć tej funkcji dwukrotnie w jednej linii!

Plik nagłówka:

<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>

Plik źródłowy:

<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>

Błąd jest zgłaszany w następujący sposób:

------ Rozpoczęto budowanie: Projekt: test, Konfiguracja: Debugowanie Win32 ------
test.cpp
c: użytkownicy ninja dokumenty wizualne studio 2010 programy test c.cpp (24): błąd C2440: 'argument domyślny': nie można przekonwertować z 'const float *' na 'const float &'
Powód: nie można przekonwertować z „const float *” na „const float”
Nie ma kontekstu, w którym ta konwersja jest możliwa

Linia obrażająca to ta, w której próbuję dwukrotnie wywołać smartEqual () używając logicznego AND.

Nie rozumiem, dlaczego tak się dzieje. Zmiana „eps” z typu referencyjnego na prosty typ wartości naprawia go, ale chciałbym wiedzieć, co się dzieje.

Dzięki!

questionAnswers(3)

yourAnswerToTheQuestion