2010-02-14 2 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, чтобы он был переданным по значению, а не pass-by-reference. К сожалению, в этом случае он поставляется с огромным штрафом за производительность. Он должен будет скопировать строку и список из 64-байтных блоков данных. Количество копий сделано страшно. Мне также НЕОБХОДИМО изменить исходные элементы на карте.

Кто-нибудь имел дело с этим раньше? Любые простые исправления, о которых я не знаю?

+1

Что такое 'parallel_for_each'? – GManNickG

+0

Расширение Microsoft для for_each. Они - одно и то же, за исключением того, что они парализованы. Тот же эффект можно увидеть с помощью for_each. –

+3

Хорошо, спасибо. Это должно остановить «это« параллельная_поле »вопрос. : P Если это C++ 0x, используйте '#include ' и 'std :: unordered_map' как контейнер, кстати. Расширение 'hash_map' является старым и, вероятно, устарело. У вас возникают те же проблемы, если вы меняете свой контейнер на обычную карту? Ваш код выглядит хорошо для меня. Единственное, что я мог бы порекомендовать, это использовать ваш typedef; для параметра «RunMappedTests» используйте «CompleteTestList :: value_type», чтобы убедиться, что он на 100% правильный. (и 'typedef''ing' std :: list 'не может повредить.) – GManNickG

ответ

3

std::map<T1, T2>::value_type является std::pair<const T1, T2>. Измените параметр RunMappedTests на pair<const string, list<DefaultTestContext>> &.

+1

Правильно, но итератор должен быть разыменовываться в неконстантную ссылку. Я чувствую, что это нерешенность. – GManNickG

+0

Это сработало. Поэтому победа. –

+1

Пока ключ const, он поддерживает инварианты карты. – MSN

Смежные вопросы