2

std::hash_set次のような反復処理を含むコードがあります。

typedef std::hash_set< VEdge, VEdge > MyHashSet;
MyHashSet hs;

for( int i=0; i < numFaces; ++i )
{
    VEdge myEdge( someValue, someOtherValue );

    MyHashSet::iterator it = hs.find(myEdge);

    if ( it->face[0] == -1 )
        it->face[0] = i;        // Error: "Read-only variable is not assignable"
}

単純化するためにコードを変更しましたが、何をしているかはお分かりいただけると思います。メンバーの 1 つとしてVEdge持つ構造体で定義されます。int face[2]私が抱えている問題はit->face[0]、この同じコードが MSVC で動作する (またはそう言われている) にもかかわらず、Clang が読み取り専用であることを教えてくれることです。Clang について、face何らかの形で変数を書き込み可能として定義する必要があることを意味するものはありますか?

4

1 に答える 1

7

クラスはhash_set非標準です。Microsoftのバージョンでは、を介してオブジェクトのコンテンツを変更できますiteratorが、SGIのバージョンはClangで使用していると推測しているバージョンでありiteratorconst_iterator同じタイプであるため、コンテナーのコンテンツを変更することはできません。イテレータ経由。

コンテナ内のオブジェクトの位置はハッシュによって決定され、ハッシュは値によって決定されるため、これも同様です。値を変更するには位置を変更する必要がありますが、ハッシュセットは値を変更していることを検出できないため、コンテナーに一貫性がなくなります。(変更するメンバーは実際にはハッシュに影響を与えないかもしれませんが、それhash_setを知る方法はありません。コンテンツを変更すると、Microsoftのバージョンでは動作が未定義のままになる可能性がありますが、SGIでは操作が完全に禁止されています。)

于 2012-09-18T14:09:13.123 に答える