2010-06-28 58 views
0

關於下面的C++代碼,Borland公司警告8092

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編譯編譯時,我得到一個警告不是 迭代器:在功能上劇名需要隨機迭代器:: CommonWords(const的劇名 &)const的 渦輪增量鏈接5.69版權所有(C)1997-2005 Borland公司

誰能告訴我如何解決這個問題?它與VS2010和GNU乾淨地編譯

+1

是什麼類型'outputList'? – jalf 2010-06-28 13:41:20

+0

typedef std :: list StringList; 它是std :: list aCuria 2010-06-28 13:58:26

+0

您是否可以確認您標記的行肯定是警告消息中的行(worder.cpp,第138行)? – 2010-06-28 14:11:52

回答

1

那麼,std::list上的sort成員函數並沒有像你的那樣採用二元函子,所以從查看你的發佈代碼,我會說你的編譯器是錯誤的。

但是,錯誤消息您發佈的困惑我:

random iterator required in function Worder::CommonWords(const Worder &) const 

爲什麼說一個隨機迭代器在CommonWords要求?是CommonWordssort就是所謂的功能?

+0

是的,這種排序是在CommonWords中調用的。 – aCuria 2010-06-29 03:44:08

+0

我想它是一個編譯器錯誤,可惜沒人有更確定的答案。 – aCuria 2010-07-05 15:29:42

1

就個人而言,我覺得名字LengthAlphabeticalSort混淆,因爲那種純粹是長度,而不是由一些字母。此外,你應該參照給const將字符串傳遞,並且如果其他是多餘的:

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; 
    } 
}; 
+0

初始列表保證按字母順序排列。因此,因爲list.sort()保證是一個穩定的排序,所以按長度排序會給出一個按長度排序的排序,如果長度相同,按照字母順序排列,因此命名約定。 通過引用和多餘的if-else是我忽略的東西。 +1 – aCuria 2010-06-29 03:42:29

+0

@aCuria:我更新了我的帖子。 – fredoverflow 2010-06-29 07:42:05

+0

theres爲什麼它已經按字母順序排列。我在兩個集合上調用set_intersection並將結果輸出到列表中。因此,名單總是按字母順序排列。 – aCuria 2010-06-29 12:45:07

0

最近,我碰到這個問題來了,而舊版本的Borland下做一些彙編,以及(這個問題可以固定在較新版本)。我能夠進行試驗,並發現它似乎Borland公司通過函數名稱進行查找,看是否你可能會調用一個STL算法。因此,任何與stl算法完全相同的名稱都會檢查是否將正確的迭代器類型傳遞給函數。

這很麻煩,因爲排序是std::sort(RandomAccessIterator first, RandomAccessIterator last)算法,但排序也是std::list::sort(Compare comp)方法。不幸的是,這給我的印象是一個非常令人震驚的編譯器錯誤,這是完全依賴於函數/方法的名稱。

我不知道std :: list或其他容器的方法與被命名爲與算法相同的方法是什麼,但最好的解決方案是通過使用命令行參數來忽略該特定問題的警告。行選項:-w-8092