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作为分配的目标:

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

如果您希望能够将 an 分配intVertStruct您提供的 a 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]

是 a 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

您正在分配一个数字,它是一个intinto VertStruct,它是一个struct并且有 3 个字段(X、Y、Z)。如果要设置 X 坐标,请执行以下操作:

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