【问题标题】:Error in templated "find-and-erase" function模板化的“查找并擦除”功能出错
【发布时间】:2012-07-15 07:23:00
【问题描述】:
template <typename CONTAINER_TYPE, typename CONTAINER_VALUE_TYPE>
bool FindAndErase(CONTAINER_TYPE& cont, const CONTAINER_VALUE_TYPE& value)
{
    CONTAINER_TYPE::iterator it = eastl::find(cont.begin(), cont.end(), value);
    if (it != cont.end())
    {
        cont.erase(it);
        return true;
    }
    return false;
}

此代码在 Visual C++ 2005 上编译良好,但使用 ARM 编译器(“ARM C/C++ 编译器,RVCT4.0”)和 iOS gcc(“arm-apple-darwin9-gcc (GCC) 4.2.1 ") 返回错误:

错误:#65:应为“;” 错误:#20:标识符“it”未定义

分别在第 4 行和第 5 行。

这段代码有什么问题?

【问题讨论】:

    标签: c++ templates stl iterator


    【解决方案1】:

    试试

    typename CONTAINER_TYPE::iterator it ...
    

    【讨论】:

    • 无意冒犯,但我不明白这是如何获得 9 票的,而 Nawaz 的回答提供了解释和替代方案,只有 5 票...
    • @LuchianGrigore 我也不 ;-)
    【解决方案2】:

    从属名称。 MSVS 不会将此视为错误。你需要一个额外的typename

    typename CONTAINER_TYPE::iterator it = eastl::find(cont.begin(), cont.end(), value);
    

    【讨论】:

      【解决方案3】:

      typename 用作:

      typename CONTAINER_TYPE::iterator it = //...
      

      因为iterator 是一个依赖的名字,你需要告诉编译器后面是一个类型,而不是静态值

      在 C++11 中,您可以将 auto 用作:

      auto it = eastl::find(cont.begin(), cont.end(), value);
      

      真是一种解脱!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-21
        • 2020-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-04
        • 2016-08-08
        • 1970-01-01
        相关资源
        最近更新 更多