关于以下C ++代码,
LengthAlphabeticalSort lengthAlphabeticalSort;
outputList.sort(lengthAlphabeticalSort); // causes borland 8092 error, guaranteed stable_sort.
class LengthAlphabeticalSort
{
public:
bool operator() (std::string str1, std::string str2)
{
if(str1.length() < str2.length())
return true;
else
return false;
}
};
使用borland编译器编译时会收到警告:
警告W8092 worder.cpp 138:传递给'sort'的模板参数_Pr3不是 迭代器:函数Worder :: CommonWords中需要的随机迭代器(const Worder &amp;)const Turbo Incremental Link 5.69版权所有(c)1997-2005 Borland
有人能告诉我如何解决这个问题吗?它使用VS2010和gnu
完全编译答案 0 :(得分:1)
嗯,sort
上的std::list
成员函数确实采用了像你这样的二元仿函数,所以从查看你发布的代码开始,我会说你的编译器是错误的。
但是,您发布的错误消息让我感到困惑:
random iterator required in function Worder::CommonWords(const Worder &) const
为什么说CommonWords
需要随机迭代器? CommonWords
是sort
被调用的函数吗?
答案 1 :(得分:1)
就个人而言,我发现名称LengthAlphabeticalSort
令人困惑,因为排序纯粹是按长度排序,而不是按字母顺序排列。此外,您应该通过引用到const传递字符串,而if-else是多余的:
struct ByLength
{
bool operator()(const std::string& a, const std::string& b)
{
return a.length() < b.length();
}
};
保证初始列表按字母顺序排列。
这是否意味着你要排序两次,先按字母排序,然后按长度排序?我认为最好只用适当的谓词排序一次:
struct FirstByLengthThenAlphabetical
{
bool operator()(const std::string& a, const std::string& b)
{
if (a.length() < b.length()) return true;
if (b.length() < a.length()) return false;
return a < b;
}
};
答案 2 :(得分:0)
最近,我在Borland的旧版本下进行一些编译时遇到了这个问题(这个问题可能会在更新的版本中修复)。我能够试验并发现Borland似乎按函数名查找,看看你是否可能正在调用stl算法。因此,任何与stl算法完全相同的命令都将检查您是否将正确的迭代器类型传递给函数。
这很麻烦,因为sort是std::sort(RandomAccessIterator first, RandomAccessIterator last)
算法,但sort也是std::list::sort(Compare comp)
方法。不幸的是,这对我来说是一个非常令人震惊的编译器错误,完全取决于函数/方法的名称。
我不知道std :: list或其他具有与算法名称相同的方法的容器的解决方法是什么,但最好的解决方案是使用命令行忽略该特定问题的警告选项:-w-8092