2

複数のデータ型とベクトルを保持するデータ ツリーを作成しようとしています。私がこれまでに持っているものを以下に示します。

struct VertStruct{
    double X, Y, Z;
};
struct FaceStruct{
    int F1, F2, F3, F4;
};
struct FaceNormalStruct{
    double X, Y, Z;
};
struct LODStruct{
    std::vector<VertStruct> Verts;
    std::vector<FaceStruct> Faces;
    std::vector<FaceNormalStruct> FaceNormals;
};
struct ChunkStruct{
    std::vector<LODStruct> LOD;
};

int main(){

    std::vector<ChunkStruct> Chunk;
    Chunk.resize(100);

    for(int i = 0; i < 100; i++)
    {
        Chunk[i].LOD.resize(5);

        for(int j = 0; j < 5; j++)
        {
            Chunk[i].LOD[j].Verts.resize(36);
            Chunk[i].LOD[j].Faces.resize(25);
            Chunk[i].LOD[j].FaceNormals.resize(25);
        }
    }
return 1;
}

これは問題なくコンパイルされ、まさに私が望むものですが、値を次のように設定しようとすると:

int Number = 42;
Chunk[5].LOD[4].Verts[3] = Number;

次に、次のエラーが表示されます。

 main.cpp|126|error: no match for 'operator=' in 'Chunk.std::vector<_Tp, _Alloc>::operator[] [with _Tp = ChunkStruct, _Alloc = std::allocator<ChunkStruct>](5u)->ChunkStruct::LOD.std::vector<_Tp, _Alloc>::operator[] [with _Tp = LODStruct, _Alloc = std::allocator<LODStruct>](4u)->LODStruct::Verts.std::vector<_Tp, _Alloc>::operator[] [with _Tp = VertStruct, _Alloc = std::allocator<VertStruct>](3u) = Number'|

それで、私は何かを見逃していますか、それとも私がしようとしていることは不可能ですか?

4

4 に答える 4

6

Verts[3]はタイプVertStructでありNumber、であるintため、割り当てはできません(投稿されたコードでは)。VertStructのメンバーの 1 つを割り当てのターゲットとして指定できます。

Chunk[5].LOD[4].Verts[3].X = Number;

intanを aに割り当てることができるようにしたい場合は、 anVertStructを提供しますoperator=(int)(既に Luchian が述べたように) が、値が割り当てられているメンバーへの呼び出しサイトでは非常にあいまいであるように思われます。int

struct VertStruct
{
    double X, Y, Z;
    VertStruct& operator=(int d)
    {
        X = d; // Or 'Y' or 'Z' or all.
        return *this;
    }
};
于 2012-08-23T15:41:39.793 に答える
3

これ

Chunk[5].LOD[4].Verts[3]

でありVertStruct、それに整数を割り当てることはできません。

于 2012-08-23T15:41:21.847 に答える
2

あなたは何かを見逃しています、そしてそれは不可能ではありません(あなたがそれを想像することができれば、すべてが可能です.それが科学者であることのすべてです:)

Chunk[5]を返しますChunkStruct

Chunk[5].LODを返しますstd::vector<LODStruct>

Chunk[5].LOD[4]を返しますLODStruct

Chunk[5].LOD[4].Vertsを返しますstd::vector<VertStruct>

最後に、 をChunk[5].LOD[4].Verts[3]返しますVertStruct。そして、それに を割り当てようとしますint。明らかに、あなたのコードではうまくいきません。

これを機能させるには (この正確な構文)、オーバーロードする必要がありますoperator = (int x)。それ以外の場合は、必要なメンバーに を割り当てintます。

于 2012-08-23T15:42:54.147 に答える
2

intである 1 つの数値をに割り当てていますVertStruct。これは であり、struct3 つのフィールド (X、Y、Z) があります。X 座標を設定する場合は、次のようにします。

Chunk[5].LOD[5].Verts[3].X = Number;
于 2012-08-23T15:44:00.367 に答える