Почему использование этой функции C++ дважды в одной строке вызывает ошибку компиляции?

Я столкнулся с некоторыми проблемами, пытаясь реализовать функцию шаблона типа макроса проверки равенства -в Visual C++ 2010, которая была связана с ошибкой в VS в отношении аргументов по умолчанию функций шаблона . Я исправил это, обернув значение параметра в дополнительную функцию, но теперь я обнаружил, что не могу использовать функцию дважды в одной строке!

Заголовочный файл:

// example.h
#pragma once

#include 

namespace myspace
{

// Need to define this separately to avoid a Visual Studio bug
template T epsilon() { return std::numeric_limits::epsilon(); }

// A generic equality test
template inline bool smartEqual(
    const T &v1, 
    const T &v2, 
    const T &eps = epsilon())
{
    return (v1 == v2);
}

// Template specialization for floating-point numbers
template<> bool smartEqual(
    const float &v1, 
    const float &v2, 
    const float &eps);

} // namespace myspace

Исходный файл:

// example.cpp
#include "example.h"

using namespace std;
using namespace myspace;

// equal-macro specialization for floats using epsilon
template<> bool myspace::smartEqual(
    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;
}

Об ошибке сообщается следующим образом:

------Сборка запущена :Проект :тест, конфигурация :Отладка Win32------
test.cpp
c :\users\ninja\documents\visual studio 2010\projects\test\test\test.cpp (24 ):ошибка C2440 :'аргумент по умолчанию' :не может быть преобразован из 'const float *' в 'const float &'
Причина :не может преобразовать 'const float *' в 'const float'
Нет контекста, в котором это преобразование возможно.

Оскорбительная строка — это та, в которой я пытаюсь дважды вызвать smartEqual ()с помощью логического И.

Я не понимаю, почему это происходит. Изменение «eps» со ссылочного типа на простой тип значения исправляет это, но мне хотелось бы знать, что происходит.

Спасибо!

15
задан Community 23 May 2017 в 12:03
поделиться