为什么我用这段C++代码得到"非法令牌"编译时错误?

neu*_*rte 5 c++ compiler-errors visual-studio numeric-limits

在我的应用程序(在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
Run Code Online (Sandbox Code Playgroud)

...以及.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;
}
Run Code Online (Sandbox Code Playgroud)

这无法编译,给我:

------ Build build:项目:测试,配置:调试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()函数的默认值的行.

谷歌搜索显示人们与numeric_limits中的其他函数有类似的"非法令牌"错误,即min()和max(),但这些错误是由于某些特定于Windows的c ++标准库头文件中存在#define而定义的出于某些遗留原因,"min"和"max".没有提到epsilon(),我完全不知道为什么我在这里收到错误.无论如何,将函数名称从"相等"更改为类似"smartEqual"的内容仍会产生相同的错误,因此名称显然不是问题.什么是?

谢谢!

Stu*_*etz 7

看起来它是由Visual Studio中的这个错误引起的:

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

另见:

模板函数特化默认参数

  • 谢谢!我通过创建一个额外的模板函数来解决这个问题getEpsilon <T>(){return numeric_limits <T> :: epsilon(); 并使用它初始化默认参数. (2认同)
  • "鉴于此,我们计划不为我们的下一个版本修复此错误,支持更严重的问题,而没有解决方法." 啊,微软.为什么不修复这两个并延迟释放一天? (2认同)