Я столкнулся с некоторыми проблемами, пытаясь реализовать функцию шаблона типа макроса проверки равенства -в 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» со ссылочного типа на простой тип значения исправляет это, но мне хотелось бы знать, что происходит.
Спасибо!