3

このファイルをコンパイルしようとすると、エラー C2512: 'LoadingWorldlet' : no appropriate default constructor available が表示されます。明示的なコンストラクターがないため、このエラーが発生する理由が思いつきません。

struct Worldlet {
    int x, z;
    glm::mat4 worldletMatrix;
    std::vector<Voxel> blocks;
};

struct LoadingWorldlet {
    int x, z;
    std::future<Worldlet> &result;
};

class World {
public:
    World();
    ~World();

    void Init();
    void InitRenderable();
    void UpdateWorldletList(int x, int z);

    void Render(Shader* worldShader, Camera *mainPov);

    static Worldlet LoadWorldlet(int x, int z, std::ifstream &file);
private:
    std::vector<Worldlet> worldlets;
    std::vector<LoadingWorldlet> loadingWorldlets;
    std::vector<std::string> loadingTitles;
    std::vector<int> toRemove;

    Renderable cube;

    std::string worldName, prefix;

    static const float CUBE_SIZE;
    static const int LOADLIMIT = 1;

    int GetLoadRadius(int r = 0) {
        static int i = r;
        return i;
    }
};

これは、LoadingWorldlet が使用される唯一の関数です。

void World::UpdateWorldletList(int x, int z) {
    static int previousX, previousZ;

    for(int index: toRemove) {
        worldlets.erase(worldlets.begin() + index);
    }
    toRemove.clear();

    int loaded = 0;

    std::vector<int> clearList;
    for(auto &loading: loadingWorldlets) {
        if(loaded >= LOADLIMIT) break;

        worldlets.push_back(loading.result.get());
        clearList.push_back(loaded);
        loaded++;
    }
    for(int i: clearList)
        loadingWorldlets.erase(loadingWorldlets.begin()+i);

    if(previousX != x && previousZ != z) {
        int i = 0;
        for(auto worldlet: worldlets) {
            if(pow(worldlet.x - x, 2) + pow(worldlet.z - z, 2) > GetLoadRadius()) {
                toRemove.push_back(i);
            }
            i++;
        }
        for(int recX = -GetLoadRadius(); recX < GetLoadRadius(); recX++) {
            for(int recZ = -GetLoadRadius(); recZ < GetLoadRadius(); recZ++) {
                bool cont = false;
                for(auto worldlet: worldlets) {
                    if (worldlet.x == recX && worldlet.z == recZ) {
                        cont = true;
                        break;
                    }
                }
                for(auto loading: loadingWorldlets) {
                    if (loading.x == recX && loading.z == recZ) {
                        cont = true;
                        break;
                    }
                }
                if(cont || pow(recX - x, 2) + pow(recZ - z, 2) > GetLoadRadius())
                    continue;

                std::ifstream file("./worlds/" + worldName + "/" + prefix + std::to_string(recX) + "X" + std::to_string(recZ) + "Z.json");
                if (!file)
                    continue;

                LoadingWorldlet loading;
                loading.x = recX;
                loading.z = recZ;
                loading.result = std::async(LoadWorldlet, recX, recZ, file);
                loadingWorldlets.push_back(loading);
            }
        }
    }
}

デフォルトのコンストラクターを追加しようとしましたが、= 演算子がないというエラーが表示されます。コンパイラはこれらのものを自動的に追加しませんか? エラーを修正するにはどうすればよいですか? 重要な場合は、Visual Studio 2013 プレビューを使用しています。

4

1 に答える 1

2

コードを見ると、への参照をインスタンス化する方法が必要になりますstd::future<Worldlet> &result;

通常、これはコンストラクターを介して行われます。

struct LoadingWorldlet 
{
    LoadingWorldlet( std::future<Worldlet> & inWorldlet ): 
        result( inWorldlet ) {}

    int x, z;
    std::future<Worldlet> &result; 
};

それ以外の場合は、データ メンバーを参照にすることはできません (これは、他のデータ メンバーにも必須のコンストラクターがないことを前提としています)。

std::future<Worldlet> result;

于 2013-08-15T22:20:01.380 に答える