【问题标题】:could not find a match for std::find (Codegear C++ 2007)找不到 std::find 的匹配项(Codegear C++ 2007)
【发布时间】:2020-07-24 08:24:50
【问题描述】:

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

我搜索并猜测它与类型转换有关,但没有发现任何线索。 代码的目的是检查一个值是否存在于数组中。 任何建议表示赞赏。

#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 OK\n";
    else
        cout << "in group FAIL\n";
}

错误信息:

[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 和 .bdsproj 文件创建的包。当前版本的 RAD studio(10.x) 无法毫无问题地打开此项目文件。这就是我尝试 RAD studio 2007 的原因

【问题讨论】:

  • 快速提醒一下,今天的日期是 2020 年 7 月 24 日...换句话说,您正在使用一个 非常 过时的编译器,并且std::find 可能是在 C++11 中引入的。
  • Works for me 修复 main() 后。
  • @dandan78 不,std::find 存在于 C++03 或 C++98
  • 这看起来像是编译器的问题,您的代码是正确的(*array 的类型为E_TRIGGER_MODE,可转换为int)。您的编译器是否没有提供有关此错误的更多信息?它尝试了哪些重载?您可以尝试强制转换,但是...此时您应该真正获得现代编译器。
  • 让我解释一下为什么我使用这么旧的编译器。代码来自使用 BDS2006 和 .bdsproj 文件创建的包。当前版本的 RAD studio(10.x) 无法打开此项目文件。这就是我尝试 RAD studio 2007 的原因。

标签: c++ borland-c++


【解决方案1】:

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

由于要搜索的类型需要与数组元素的类型兼容,我建议完全摆脱Type 模板参数,它没有实际用途。使用Element 模板参数代替value 函数参数。如果您尝试传入不兼容的类型,编译器将在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 OK\n";
    else
        cout << "in group FAIL\n";
}

否则,不要使用int 开头,而是使用enum

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

【讨论】:

    猜你喜欢
    • 2013-06-30
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    相关资源
    最近更新 更多