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

Gha*_*nPL 4 c++ templates iterator stl

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;
}
Run Code Online (Sandbox Code Playgroud)

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

错误:#65:预期";" 错误:#20:标识符"it"未定义

分别在第4和第5行.

这段代码有什么问题?

Tor*_*zki 9

尝试

typename CONTAINER_TYPE::iterator it ...
Run Code Online (Sandbox Code Playgroud)

  • 没有冒犯,但我不知道这是如何得到9 upvotes而Nawaz的答案,提供解释和替代只有5 ...... (2认同)

Naw*_*waz 7

使用typename如:

typename CONTAINER_TYPE::iterator it = //...
Run Code Online (Sandbox Code Playgroud)

因为iterator是依赖名称,您需要告诉编译器后面的内容是类型,而不是静态值.

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

auto it = eastl::find(cont.begin(), cont.end(), value);
Run Code Online (Sandbox Code Playgroud)

终于解脱了!