2014-07-20 156 views
2

我認爲這的std ::地圖密鑰提取到的std ::載體應具有不指定--std =的C++ 0x標誌GCC(4.6)的工作,但它沒有。任何想法爲什麼?爲什麼這個std :: map鍵提取函數需要--std = C++?

template <typename Map, typename Container> 
void extract_map_keys(const Map& m, Container& c) { 
    struct get_key { 
     typename Map::key_type operator() 
      (const typename Map::value_type& p) const { 
       return p.first; 
     } 
    }; 
    transform(m.begin(), m.end(), back_inserter(c), get_key()); 
} 

謝謝!

+0

你可以指定什麼「不工作」的意思?某種形式的錯誤描述使得這個問題和下面的答案可以找到,這使得這個更有用。 –

+0

@UlrichEckhardt「不起作用」意味着一個模糊的模板實例化錯誤,只要我在命令行中添加--std = C++ 0x,就會立即消失。恐怕,添加錯誤消息不會使這個更容易搜索。 –

+0

它實際上可以讀取這些錯誤。所有你需要做的就是將它們構造一下,這樣你就可以看到填充一個頁面的模板的嵌套模板只是一個'map '。然後,剩下的所有內容都是與這些類型相關的錯誤消息,並且確實可以進行搜索。 :) –

回答

4

原因是您使用本地類型get_key作爲最後一個參數。這在C++ 98中是不允許的,而C++ 11的規則已經改變/放寬了。

這可以看出,在this example

template <class T> bool cpp0X(T) {return true;} //cannot be called with local types in C++03 
        bool cpp0X(...){return false;} 

bool isCpp0x() 
{ 
    struct local {} var; 
    return cpp0X(var); 
} 
+0

C++ 0x或C++ 11? –

+0

@DieterLückingC++ 0x成了C++ 11,那麼你的問題是什麼? –

+0

@DanielFrey,謝謝!我忘記了這個簡單的東西在C++ 98中不可用 –

相關問題