【发布时间】:2014-09-25 01:21:43
【问题描述】:
在以下代码中,std::min/max 的模板类型推导似乎很奇怪,我想知道为什么以及如何正确修复它。
以下适用于 Windows VS2013,并在 GCC-4.8 上给出编译错误:(错误见下文)
int minX = max(min(floor(v1[0]), min(floor(v2[0]), floor(v3[0]))), 0.0f);
这可以在 GCC-4.8 上编译,但在 VS2013 上会出现编译错误:(错误见下文)
int minX = max(min(floor(v1[0]), min(floor(v2[0]), floor(v3[0]))), 0.0);
v[1-3] 是cv::Vec3f v1, v2, v3;
在 OpenCV 中,cv::Vec3f 是 Vec<float, 3>,Vec 的 operator[] 是
const _Tp& operator [](int i) const;
_Tp& operator[](int i);
min/max/floor/ceil 来自 std:: 命名空间(即代码顶部的 using std::min 等)。
所以当我写的时候
int minX = max(min(floor(v1[0]), min(floor(v2[0]), floor(v3[0]))), 0.0f);
类型应该是
max(min(float, min(float, float), float);
那么为什么 GCC 会在这里纾困?
VS2013 错误:
error C2782: 'const _Ty &std::max(const _Ty &,const _Ty &)' : template parameter '_Ty' is ambiguous
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\algorithm(4086) : see declaration of 'std::max'
could be 'double' or 'float'
GCC-4.8 上的错误:
error: no matching function for call to 'max(const double&, float)'
答案:
GCC 没有使用 std::floor 而是使用全局命名空间中的 floor(由 cmath 绘制)。如果我添加using std::floor,所有代码都按预期工作!全局命名空间中讨厌的 double floor(...) 函数!
【问题讨论】:
-
MSVC 是正确的:当你调用
max(float, double)时,模板参数无法明确解析。但是,我 cannot reproduce GCC 错误你声称你看到了。 -
您能提供一个MCVE,我们可以简单地复制和粘贴它并展示您的问题吗?最好没有 OpenCV 依赖。
-
看这里goo.gl/sxzvnC,玩
using std::floor。这就是答案 :-) 我会更新我的帖子。
标签: c++ opencv visual-c++ gcc stl