borland找不到std::find的匹配项(Codegear C++2007)



以下代码在BDS 2006中没有问题。在Codegear RAD studio 2007中,生成错误。

我搜索并猜测这与类型铸造有关,但没有发现任何线索。代码的目的是检查数组中是否存在一个值。欢迎提出任何建议。

#include <algorithm>
#include <iostream>
using namespace std;
enum E_TRIGGER_MODE
{
TRIGGER_MODE_SINGLE = 0,
TRIGGER_MODE_NORMAL,
TRIGGER_MODE_AUTO,
TRIGGER_MODE_CONTINUOUS
};
static enum E_TRIGGER_MODE eMode[] = 
{ TRIGGER_MODE_AUTO, TRIGGER_MODE_NORMAL, 
TRIGGER_MODE_SINGLE, TRIGGER_MODE_CONTINUOUS };

namespace Utils
{
template<class Type, class Element, int n>
bool in_group(const Type value, const Element (&array)[n])
{
return std::find(array, array+n, value) != array+n;
}
}
void main(void)
{
int mode = TRIGGER_MODE_AUTO;
if (Utils::in_group(mode, eMode))
cout << "in group OKn";
else
cout << "in group FAILn";
}

错误消息:

[BCC32 Error] File3.cpp(44): E2285 Could not find a match for 'std::find<_InIt,_Ty>(const E_TRIGGER_MODE *,const E_TRIGGER_MODE *,const int)'

编辑:

该代码来自使用BDS2006和.bdssproj文件创建的程序包。当前版本的RAD studio(10.x(无法打开此项目文件。这就是为什么我尝试RAD工作室2007

您正试图在E_TRIGGER_MODE枚举数组中找到一个intstd::find()的第三个参数需要与通过取消引用第一个参数返回的类型兼容。编译器不允许将int隐式转换为enum,因此在将int传递给Utils::in_group()时需要使用显式类型转换。

由于要搜索的类型需要与数组元素的类型兼容,我建议完全去掉Type模板参数,它没有实际用途。对于value函数参数,请使用Element模板参数。如果尝试传入不兼容的类型,编译器将在in_group()的调用站点而不是std::find()的调用站点失败。这对用户更有用。

此外,您应该通过const引用传递value参数。无论如何,std::find()通过const引用获取该参数,因此按值将其传递到Utils::in_group()中是没有意义的。

话虽如此,试试这个:

#include <algorithm>
#include <iostream>
enum E_TRIGGER_MODE
{
TRIGGER_MODE_SINGLE = 0,
TRIGGER_MODE_NORMAL,
TRIGGER_MODE_AUTO,
TRIGGER_MODE_CONTINUOUS
};
static E_TRIGGER_MODE eMode[] = 
{ TRIGGER_MODE_AUTO, TRIGGER_MODE_NORMAL, 
TRIGGER_MODE_SINGLE, TRIGGER_MODE_CONTINUOUS };
namespace Utils
{
template<class Element, int n>
bool in_group(const Element &value, const Element (&array)[n])
{
const Element *end = array + n;
return std::find(array, end, value) != end;
}
}
void main(void)
{
int mode = TRIGGER_MODE_AUTO;
if (Utils::in_group(static_cast<E_TRIGGER_MODE>(mode), eMode))
cout << "in group OKn";
else
cout << "in group FAILn";
}

否则,一开始就不要使用int,而是使用enum

E_TRIGGER_MODE mode = TRIGGER_MODE_AUTO;
if (Utils::in_group(mode, eMode))

最新更新