【问题标题】:Why does this std::map keys extraction function need --std=c++?为什么这个 std::map 键提取函数需要 --std=c++?
【发布时间】:2014-07-20 07:27:10
【问题描述】:

我认为这个 std::map 键提取到 std::vector 应该可以在没有为 gcc (4.6) 指定 --std=c++0x 标志的情况下工作,但它没有。知道为什么吗?

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());
}

谢谢!

【问题讨论】:

  • 您能具体说明“不起作用”是什么意思吗?使这个问题和下面的答案可以找到的某种错误描述将​​使这更有用。
  • @UlrichEckhardt “不起作用”意味着一个神秘的模板实例化错误,当我将 --std=c++0x 添加到命令行时,我看到该错误消失了。恐怕添加错误消息不会使搜索更容易。
  • 实际上可以读取这些错误。您需要做的只是稍微构造它们,以便您看到填充一页的模板的嵌套模板只是一个map&lt;string,string&gt;。然后,剩下的就是与这些类型相关的错误消息,并且肯定可以搜索到。 :)

标签: c++ c++11 g++


【解决方案1】:

原因是您使用本地类型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);
}

【讨论】:

  • @DieterLücking C++0x 变成了 C++11,那么你的问题是什么?
  • @DanielFrey,谢谢!我忘了这个简单的东西在 C++98 中是不可用的
猜你喜欢
  • 2021-10-22
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2018-01-02
相关资源
最近更新 更多