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 では、次のように使用できますauto

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 に答える