模板化“查找和擦除”功能出错

时间:2012-07-16 12:34:30

标签: c++ templates stl iterator

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编译器(&#34; ARM C / C ++编译器,RVCT4.0&#34;)和iOS gcc(&#34; arm-apple-darwin9)进行编译-gcc(GCC)4.2.1&#34;)返回错误:

错误:#65:预期a&#34 ;;&#34; 错误:#20:标识符&#34;它&#34;未定义

分别在第4和第5行。

此代码有什么问题?

3 个答案:

答案 0 :(得分:9)

尝试

typename CONTAINER_TYPE::iterator it ...

答案 1 :(得分:7)

typename用作:

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

因为iterator依赖名称,您需要告诉编译器接下来是类型,而不是静态值

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

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

真是一种解脱!

答案 2 :(得分:3)

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

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