Por que usar essa função C ++ duas vezes em uma linha causa um erro de compilação?

Eu tive um problema ao tentar implementar uma função de modelo de tipo de macro de teste de igualdade inteligente no Visual C ++ 2010 que tinha a ver com umbug no VS em relação aos argumentos padrão das funções do template. Eu corrigi-lo, envolvendo o valor do parâmetro em uma função extra, mas agora descobri que não posso usar a função duas vezes em uma linha!

Arquivo de cabeçalho:

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

Arquivo fonte:

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

O erro é relatado da seguinte maneira:

------ Build started: Projeto: test, Configuration: Debug Win32 ------
test.cpp
c: \ usuários \ ninja \ documentos \ visual studio 2010 \ projetos \ teste \ teste \ teste.cpp (24): erro C2440: 'argumento padrão': não é possível converter de 'const float *' para 'const float &'
Razão: não é possível converter de 'const float *' para 'const float'
Não há contexto em que essa conversão seja possível

A linha problemática é aquela em que tento chamar smartEqual () duas vezes usando o AND lógico.

Eu não entendo porque isso acontece. Alterar "eps" de um tipo de referência para um tipo de valor simples corrige, mas eu gostaria de saber o que estava acontecendo.

Obrigado!

questionAnswers(3)

yourAnswerToTheQuestion