【发布时间】:2012-05-07 19:04:47
【问题描述】:
我在尝试在 Visual C++ 2010 中实现与 bug in VS in regard to default arguments of template functions 相关的智能相等测试宏类型模板函数时遇到了一些麻烦。我通过将参数的值包装在一个额外的函数中来修复它,但现在我发现我不能在一行中使用该函数两次!
头文件:
// 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 ------
测试.cpp
c:\users\ninja\documents\visual studio 2010\projects\test\test\test.cpp(24):错误 C2440:“默认参数”:无法从“const float *”转换为“const float &”
原因:无法从 'const float *' 转换为 'const float'
没有可以进行这种转换的上下文
违规行是我尝试使用逻辑 AND 调用 smartEqual() 两次的行。
我不明白为什么会这样。将“eps”从引用类型更改为简单的值类型可以修复它,但我希望我知道发生了什么。
谢谢!
【问题讨论】:
-
如果你用 2 个 不同的 类型实例化
smartEqual<>()2 次,会不会留下 2 个版本的epsilon(),它们只在返回类型上有所不同?跨度> -
@Pavel:这确实也是一个有趣的问题,但作为 int ei = epsilon
();浮点 ef = epsilon();编译好,似乎它们是某种独立的函数。我的意思是,编译器以某种方式区分它们。不知道如何。
标签: c++ visual-studio type-conversion default-arguments