Visual C++ 2010 でスマート等価テスト マクロ型テンプレート関数を実装しようとしたときに、テンプレート関数の既定の引数に関する VS のバグに関係する問題に遭遇しました。パラメーターの値を追加の関数でラップして修正しましたが、関数を 1 行で 2 回使用できないことがわかりました。
ヘッダー ファイル:
// example.h
#pragma once
#include <limits>
namespace myspace
{
// Need to define this separately to avoid a Visual Studio bug
template<typename T> T epsilon() { return std::numeric_limits<T>::epsilon(); }
// A generic equality test
template<typename T> inline bool smartEqual(
const T &v1,
const T &v2,
const T &eps = epsilon<T>())
{
return (v1 == v2);
}
// Template specialization for floating-point numbers
template<> bool smartEqual<float>(
const float &v1,
const float &v2,
const float &eps);
} // namespace myspace
ソースファイル:
// example.cpp
#include "example.h"
using namespace std;
using namespace myspace;
// equal-macro specialization for floats using epsilon
template<> bool myspace::smartEqual<float>(
const float &v1,
const float &v2,
const float &eps)
{
return (fabs(v1 - v2) < eps);
}
int _tmain(int argc, _TCHAR* argv[])
{
float a,b;
bool x = smartEqual(a,b); // works ok
bool x = smartEqual(a,b) && smartEqual(b,a); // error
return 0;
}
エラーは次のように報告されます。
------ ビルド開始: プロジェクト: テスト、構成: Win32 のデバッグ ------
test.cpp
c:\users\ninja\documents\visual studio 2010\projects\test\test\test.cpp(24 ): エラー C2440: 'default argument' : 'const float *' から 'const float &'
に変換できません理由: 'const float *' から 'const float' に変換できません
この変換が可能なコンテキストがありません
問題のある行は、論理 AND を使用して smartEqual() を 2 回呼び出そうとした行です。
なぜこれが起こるのかわかりません。「eps」を参照型から単純な値型に変更すると修正されますが、何が起こっているのか知りたいです。
ありがとう!