2014-07-20 123 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中不可用 –

相关问题