Почему я получаю ошибку "незаконного токена" во время компиляции с этим фрагментом кода 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 показал, что у людей были подобные ошибки "недопустимого токена" с другими функциями из numeric_limits, а именно min() и max(), но они были вызваны тем, что #define присутствовал в заголовочных файлах стандартной библиотеки C++ для Windows, которые определяли "min" и "max" по некоторым причинам Нет упоминания о epsilon(), и я совершенно озадачен тем, почему я получаю ошибку здесь. В любом случае, изменение имени функции с "равного" на что-то вроде "smartEqual" все равно приводит к той же ошибке, поэтому имя, очевидно, не является проблемой. Что такое?

Спасибо!

1 ответ

Решение

Похоже, это вызвано этой ошибкой в ​​Visual Studio:

https://connect.microsoft.com/VisualStudio/feedback/details/583081/

Смотрите также здесь:

аргумент по умолчанию для специализации шаблонной функции

Другие вопросы по тегам