5

在我的应用程序(在 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 跳过 ==========

有问题的行是定义了 equal() 函数的“eps”参数默认值的行。

谷歌搜索显示人们在 numeric_limits 中的其他函数(即 min() 和 max())也有类似的“非法令牌”错误,但这是由于特定于 Windows 的 c++ 标准库头文件中存在一些#define,它定义了由于某些遗留原因,“min”和“max”。没有提到 epsilon(),我对为什么我在这里遇到错误感到非常困惑。无论如何,将函数名称从“equal”更改为“smartEqual”之类的名称仍然会出现相同的错误,因此名称显然不是问题。什么是?

谢谢!

4

1 回答 1

8

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

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

另请参阅此处:

模板函数特化默认参数

于 2012-04-27T00:34:49.343 回答