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!