将lower_bound与矢量<对<字符串、双精度一起使用时出错>>
Error when using lower_bound with vector<pair<string, double>>
我有一个缓存的实现,它是这样定义的;
std::vector<TEntryPair> m_listEntries;
其中CCD_ 1被定义为;
typedef std::pair<std::string, FILETIME> TEntryPair;
当将新记录插入到高速缓存中时,我使用std::lower_bound
在高速缓存中找到正确的插入排序位置,如下所示;
void AddCacheEntry(std::string const& strResourceName, FILETIME const& fTime)
{
auto it = std::lower_bound(std::begin(m_listEntries),
std::end(m_listEntries),
strName);
m_listEntries.insert(it, std::make_pair(strName, fTime));
}
新条目基于std::string
参数进行插入排序,第二个值基本上是元数据。
我为std::lower_bound
定义了以下运算符,以便在尝试插入新记录时使用;
bool operator < (std::string const& str, TEntryPair const& rhs)
{
return str < rhs.first;
}
bool operator < (TEntryPair const& lhs, std::string const& str)
{
return lhs.first < str;
}
现在,这一切都很好,直到我不得不将TEntryPair
的定义更改为以下内容;
std::pair<std::string, double>
有人能解释一下为什么我定义的运算符在使用std::pair<std::string, double>
而不是std::pair<std::string, FILETIME>
时不能使用吗?
编译器给出以下错误;
Error 9 error C2676: binary '<' : 'std::pair<_Ty1,_Ty2>' does not define this operator or a conversion to a type acceptable to the predefined operator c:program files (x86)microsoft visual studio 11.0vcincludealgorithm 2736
Error 3 error C2784: 'bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const _Elem *' from 'std::pair<_Ty1,_Ty2>' c:program files (x86)microsoft visual studio 11.0vcincludealgorithm 2736
Error 7 error C2784: 'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : could not deduce template argument for 'const std::_Revranit<_RanIt,_Base> &' from 'std::pair<_Ty1,_Ty2>' c:program files (x86)microsoft visual studio 11.0vcincludealgorithm 2736
Error 2 error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'std::pair<_Ty1,_Ty2>' c:program files (x86)microsoft visual studio 11.0vcincludealgorithm 2736
Error 4 error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'std::pair<_Ty1,_Ty2>' c:program files (x86)microsoft visual studio 11.0vcincludealgorithm 2736
Error 5 error C2784: 'bool std::operator <(const std::move_iterator<_RanIt> &,const std::move_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::move_iterator<_RanIt> &' from 'std::pair<_Ty1,_Ty2>' c:program files (x86)microsoft visual studio 11.0vcincludealgorithm 2736
Error 8 error C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : could not deduce template argument for 'const std::pair<_Ty1,_Ty2> &' from 'const std::string' c:program files (x86)microsoft visual studio 11.0vcincludealgorithm 2736
Error 6 error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'std::pair<_Ty1,_Ty2>' c:program files (x86)microsoft visual studio 11.0vcincludealgorithm 2736
Error 1 error C2784: 'bool std::operator <(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : could not deduce template argument for 'const std::vector<_Ty,_Alloc> &' from 'std::pair<_Ty1,_Ty2>' c:program files (x86)microsoft visual studio 11.0vcincludealgorithm 2736
顺便说一句,我可以定义以下内容并编译/运行代码而不会出现任何错误;
struct STemp
{
double m_Value;
}
typedef std::pair<std::string, STemp> TEntryPair;
似乎只是"基本"类型有问题?
罪魁祸首似乎是c++名称解析(特别是依赖于参数的查找)与预定义的运算符<在标准库中。
如果TEntryPair完全位于标准库中,则运营商<在顶级命名空间中找不到(在命名空间std之外没有运算符<的参数,因此只有命名空间std会被考虑用于参数相关查找)。
尽管标准明确规定不允许重载命名空间std中的函数,但我能找到的唯一解决方案是将运算符<在命名空间std中,由于您正在调用运算符<来自命名空间std,参数都属于命名空间std.
对于符合标准的解决方案,您可能需要定义自己的类,而不是使用std::pair。
#include <vector>
#include <algorithm>
#include <string>
typedef double MyType;
struct TEntryPair {
std::string first;
MyType second;
};
bool operator < (std::string const& str, TEntryPair const& rhs)
{
return str < rhs.first;
}
bool operator < (TEntryPair const& lhs, std::string const& str)
{
return lhs.first < str;
}
std::vector<TEntryPair> m_listEntries;
void AddCacheEntry(std::string const& strResourceName, MyType fTime)
{
auto it = std::lower_bound(std::begin(m_listEntries),
std::end(m_listEntries),
strResourceName);
}
int main() { }
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中