Почему я получаю ошибку времени компиляции «недопустимый токен» -с этим фрагментом кода C++?

В моем приложении (, скомпилированном под Visual C++ 2010 ), у меня есть такой код в заголовочном файле:

// example.h
#pragma once

#include <limits>

namespace myspace
{

// A generic equality test
template<typename T> inline bool equal(
    const T &v1, 
    const T &v2, 
    const T &eps = std::numeric_limits<T>::epsilon())
{
    return (v1 == v2);
}

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

// A generic equality test for finite-precision real number representations (with epsilon)
template<typename T> inline bool realEqual(
    const T &p, 
    const T &q, 
    const T &eps = std::numeric_limits<T>::epsilon())
{
    return (fabs(p - q) < eps);
}

} // namespace myspace

...и некоторый код в файле.cpp:

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

using namespace std;
using namespace myspace;

// equal-macro specialization that calls the appropriate equality test function for real numbers
template<> bool myspace::equal<float>(
    const float &v1, 
    const float &v2, 
    const float &eps)
{
    return (realEqual(v1, v2, eps));
}

int _tmain(int argc, _TCHAR* argv[])
{
    float a,b;
    bool x = realEqual(a,b); // OK
    bool x = equal(a,b); // compile error
    return 0;
}

Это не работает скомпилировать, дав мне:

------Сборка началась :Проект :тест,Конфигурация :Отладка Win32------
test.cpp
c :\users\ninja\documents\visual studio 2010\projects\test\test\test.h (10 ):ошибка C2589 :'::' :недопустимый токен с правой стороны '::'
c :\users\ninja\documents\visual studio 2010\projects\test\test\test.h (10 ):ошибка C2059 :синтаксическая ошибка :'::'
========== Сборка :0 выполнена успешно, 1 неудачно, 0 до -до -даты, 0 пропущено ==========

Неверная строка тот с определением значения параметра "eps" по умолчанию для функции equal ().

Поиск в Google показал, что люди сталкивались с похожими ошибками «недопустимый токен» с другими функциями из числовых _ограничений, а именно min ()и max (), но это было связано с некоторыми #определениями, присутствующими в Файлы заголовков стандартной библиотеки C++, специфичные для Windows -, которые определяют «min» и «max» по некоторым устаревшим причинам. Нет упоминания о epsilon (), и я абсолютно озадачен тем, почему я получаю здесь ошибку. В любом случае, изменение имени функции с «equal» на что-то вроде «smartEqual» по-прежнему дает ту же ошибку, поэтому имя, очевидно, не проблема. Что?

Спасибо!

5
задан neuviemeporte 27 April 2012 в 00:33
поделиться