2012-08-13 44 views
0
432  void RoleExternModel::getShareConfig(SourceList& sourceList, std::vector<UInt16>& packs, ShopModel& shopModel) 
    433  { 
    434   std::copy(Packs, Packs + SHARE_PRIZE, std::insert_iterator<std::vector<UInt16> >(packs, packs.begin())); 
    435   struct Fun { 
    436    std::vector<std::pair<UInt16, UInt8> > pairs; 
    437    void operator() (UInt16 type) { 
    438     pairs.push_back(std::make_pair<UInt16, UInt8>(type, Configuration::PACKS)); 
    439    } 
    440   }; 
    441   Fun fun(); 
    442   std::for_each(Packs, Packs + SHARE_PRIZE, fun); 
    443   shopModel shopModel(fun.pairs); 
    444   shopModel.load(sourceList); 
    445  } 

爲什麼編譯器說:非本地函數調用本地類型

error: non-local function ‘Pet::RoleExternModel::getShareConfig(Pet::SourceList&, std::vector >&, Pet::ShopModel&)::Fun Pet::fun()’ uses local type ‘Pet::RoleExternModel::getShareConfig(Pet::SourceList&, std::vector >&, Pet::ShopModel&)::Fun’

如何使它legel?

+0

我們需要一個完整的自包含測試用例來幫助您。 – zwol 2012-08-13 04:07:51

+1

'有趣的樂趣();'或'有趣的樂趣;',我懷疑! – perilbrain 2012-08-13 04:14:23

+0

Fun fun(); - 一個問題......如果修復不起作用,那麼我們需要看到更多...例如Packs? Packs是什麼類型?我看到'包'.. – dans3itz 2012-08-13 04:16:49

回答

2

這條線的問題是:

Fun fun(); 

它聲明功能fun不帶參數,並返回一個Fun對象。

這叫做the most vexing parse

刪除括號,而是聲明名爲fun的對象。

0

其他答案在編譯器錯誤上在技術上是正確的,但錯過了一個微妙點:fun使用不正確。它似乎是作爲收集fun.pairs中的結果的局部變量。但是,std::for_each可以複製fun,然後fun.pairs不會更新。

正確的解決方案:Fun fun = std::for_each(Packs, Packs + SHARE_PRIZE, Fun());