我有这样的结构。
struct MaxWinPerElementInfo
{
std::string paytableName;
std::string elementName;
long long elementCredits;
bool multiplierRequired;
};
我想找到与paytableName
匹配的元素。为此我计划使用带有谓词函数的std::find_if
。
我在struct MaxWinPerElementInfo
as,
bool operator() ( const MaxWinPerElementInfo &elementInfo ) const
{
return paytableName == elementInfo.paytableName;
}
现在我尝试通过调用
来搜索元素 std::find_if( elementInfo.begin(), elementInfo.end(), MaxWinPerElementInfo( paytable));
,其中
elementInfo
为std::vector< struct MaxWinPerElementInfo >
,paytable
为std::string
。
为此,我收到错误no known conversion for argument 1 from ‘std::string {aka std::basic_string<char>}’ to ‘const MaxWinPerElementInfo&’
我不能使用c ++ 11,因为这是遗留代码。
我在这里缺少什么?任何建议都会非常有用。
答案 0 :(得分:3)
std::find_if( elementInfo.begin(), elementInfo.end(),
MaxWinPerElementInfo( paytable));
您正在尝试通过传递一个字符串来构造MaxWinPerElementInfo
。你有一个构造函数采取字符串?我想不是这样,编译器会尝试调用复制构造函数,该构造函数采用const MaxWinPerElementInfo
引用。如果没有定义构造函数的单个参数,编译器将恢复为它所知道的唯一一个:复制构造函数。
由于你有一个结构并且成员是公共的,我建议用一个仿函数对象在类之外实现它。
struct MaxWinPerElementInfoPayTablePredicate
{
MaxWinPerElementInfoPayTablePredicate(const std::string& _paytableName) :
paytableName(_paytableName) {}
bool operator() ( const MaxWinPerElementInfo &elementInfo ) const
{
return paytableName == elementInfo.paytableName;
}
std::string paytableName;
}
然后这样称呼它:
std::find_if( elementInfo.begin(), elementInfo.end(),
MaxWinPerElementInfoPayTablePredicate(paytable) );
答案 1 :(得分:3)
您的类没有接受类型为std :: string的参数的转换构造函数。因此编译器发出解析表达式
的错误MaxWinPerElementInfo( paytable)
您可以使用lambda表达式而不是功能对象。例如
std::find_if( elementInfo.begin(), elementInfo.end(),
[&] ( const MaxWinPerElementInfo &elementInfo )
{
return paytableName == elementInfo.paytableName;
} );
如果你不使用lambda表达式,那么你可以在structire里面定义一个功能对象。例如
struct MaxWinPerElementInfo
{
std::string paytableName;
std::string elementName;
long long elementCredits;
bool multiplierRequired;
struct FindByPaytableName
{
FindByPaytableName( const std::string &paytableName ) : paytableName( paytableName ) {}
std::string paytableName;
bool operator() ( const MaxWinPerElementInfo &elementInfo ) const
{
return paytableName == elementInfo.paytableName;
}
};
};
std::find_if( elementInfo.begin(), elementInfo.end(),
MaxWinPerElementInfo::FindByPaytableName( paytableName ) );
使用内部结构,您可以使用外部结构的各种数据成员定义几个搜索条件。
答案 2 :(得分:2)
您需要添加一个构造函数,该构造函数接受一个字符串并将其放在paytableName中。否则,您无法在find_if()
调用中尝试从字符串创建MaxWinPerElementInfo。