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 \ document \ visual studio 2010 \ projects \ test \ test \ test.h(10 ):エラーC2589:'::':'::'の右側に不正なトークン
c:\ users \ ninja \ document \ visual studio 2010 \ projects \ test \ test \ test.h(10):エラーC2059:構文エラー:'::'
==========ビルド:0成功、1失敗、0最新、0スキップ==========

問題のある行は、equal()関数の「eps」パラメーターのデフォルト値が定義されている行です。

グーグル検索は、numeric_limitsの他の関数、すなわちmin()とmax()で同様の「違法トークン」エラーが発生したことを明らかにしましたが、これらは、Windows固有のc++標準ライブラリヘッダーファイルに存在する#defineが原因でした。いくつかのレガシーな理由で「最小」と「最大」。epsilon()については言及されていません。ここでエラーが発生する理由について、私は絶対に困惑しています。とにかく、関数名を「equal」から「smartEqual」のようなものに変更しても同じエラーが発生するため、名前は明らかに問題ではありません。とは?

ありがとう!

4

1 に答える 1

8

VisualStudioのこのバグが原因のようです。

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

こちらもご覧ください:

テンプレート関数の特殊化のデフォルト引数

于 2012-04-27T00:34:49.343 に答える