以下代码在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
枚举数组中找到一个int
。std::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))