2010-02-14 55 views
2

我想在我的代碼使用for_each循環,但我發現了以下錯誤:通過引用不可能?

cannot convert parameter 1 from 'std::pair<_Ty1,_Ty2>' to 'std::pair<_Ty1,_Ty2> &' 

這裏是有問題的代碼:

typedef stdext::hash_map< 
     std::string, std::list<DefaultTestContext> 
    > CompleteTestList; 

static void RunMappedTests(pair<string, list<DefaultTestContext>>& tests) 
{ 
    RunAllTestsInList(tests.second); 
} 

void RunTestsInParallel(CompleteTestList& testList) 
{ 
    for_each(testList.begin(), testList.end(), RunMappedTests); 
} 

當然,簡單的辦法是將RunMappedTests的參數更改爲傳遞值而不是傳遞引用。不幸的是,在這種情況下,它帶來了巨大的性能損失。它將不得不復制一個字符串和一個〜64字節的數據塊列表。複製的數量是可怕的。我也需要修改地圖中的原始元素。

以前有人處理過這個嗎?任何簡單的修復,我不知道?

+1

什麼是'parallel_for_each'? – GManNickG 2010-02-14 20:16:30

+0

對for_each的Microsoft擴展。他們是一樣的,除了一個人的parallized。使用for_each可以看到同樣的效果。 – 2010-02-14 20:19:58

+3

好的,謝謝。這應該停止「這是parallel_for_each」問題的分支。 :P如果這是C++ 0x,順便說一句,使用'#include '和'std :: unordered_map'作爲容器。 'hash_map'擴展名是舊的,可​​能不推薦使用。如果將容器更改爲普通的「地圖」,是否會遇到同樣的問題?你的代碼對我來說看起來很好。我唯一能推薦的就是使用你的typedef;對於'RunMappedTests'的參數,使用'CompleteTestList :: value_type'來確保它是100%正確的。 (和'typedef''ing'std :: list '無法傷害。) – GManNickG 2010-02-14 20:24:39

回答

3

std::map<T1, T2>::value_typestd::pair<const T1, T2>。將參數RunMappedTests更改爲pair<const string, list<DefaultTestContext>> &

+1

正確,但迭代器應解引用到非const引用。我覺得這是一個沒有解決的問題。 – GManNickG 2010-02-14 20:27:19

+0

它工作。所以贏了。 – 2010-02-14 20:37:04

+1

只要鍵是const,它就會保持映射的不變量。 – MSN 2010-02-14 20:45:44