Я столкнулся с некоторыми проблемами с попыткой реализовать в Visual С++ 2010 функцию шаблона макросов типа проверки равенства, которая связана с ошибкой в VS в отношении аргументов по умолчанию шаблона функции. Я исправил его, добавив значение параметра в дополнительную функцию, но теперь обнаружил, что не могу использовать эту функцию дважды в одной строке!
Заголовочный файл:
// 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
Исходный файл:
// 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;
}
Ошибка сообщается следующим образом:
------ Начало сборки: Project: test, Configuration: Debug Win32 ------
test.cpp
c:\users\ninja\documents\visual studio 2010\projects\test\test\test.cpp(24): ошибка C2440: 'default argument': невозможно преобразовать из 'const float *' в 'const float &' < ш > Причина: невозможно преобразовать из 'const float *' в 'const float'
Нет никакого контекста, в котором это преобразование возможно
Строка оскорбления - это ту, где я пытаюсь дважды вызвать smartEqual(), используя логический И.
Я не понимаю, почему это происходит. Изменение "eps" от ссылочного типа до простого типа значения фиксирует его, но мне хотелось бы знать, что происходит.
Спасибо!