4
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 行。

这段代码有什么问题?

4

3 回答 3

9

尝试

typename CONTAINER_TYPE::iterator it ...
于 2012-07-16T12:37:07.837 回答
7

用作typename

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

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

在 C++11 中,你可以使用autoas:

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

终于解脱了!

于 2012-07-16T12:37:26.077 回答
3

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

typename CONTAINER_TYPE::iterator it = eastl::find(cont.begin(), cont.end(), value);
于 2012-07-16T12:37:20.500 回答