没有显式构造函数的结构中出现错误C2512
error C2512 in a struct with no explicit constructor
当我试图编译此文件时,我收到错误C2512:"LoadingWorldlet":没有合适的默认构造函数可用。没有显式构造函数,所以我想不出有什么理由会收到这个错误。
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预览版。
查看代码,您需要一种方法来实例化对std::future<Worldlet> &result;
的引用
通常,这是通过构造函数完成的。
struct LoadingWorldlet
{
LoadingWorldlet( std::future<Worldlet> & inWorldlet ):
result( inWorldlet ) {}
int x, z;
std::future<Worldlet> &result;
};
否则,您就不能简单地将数据成员作为引用(这假设其他数据成员也没有强制构造函数):
std::future<Worldlet> result;
相关文章:
- 错误 C2512 视觉C++(并且不是循环依赖项)
- 错误 C2512:没有可用的适当默认构造函数:在构造函数中声明带有参数的对象!
- c++ 错误错误 C2512 没有合适的默认构造函数可用
- 错误 C2512 和 C3892 - 像游戏一样构建吃豆人
- 错误 C2512 'DerivedClass':没有可用的适当默认构造函数
- 错误C2512没有合适的默认构造函数,即使我有一个
- 错误 C2512:没有可用的适当默认构造函数(不是类)
- 预编译头文件中出现错误 C2512
- 结构,数组错误 C2512
- 在构造函数调用中收到错误 C2512
- 错误C2512没有合适的默认构造函数可用
- 没有显式构造函数的结构中出现错误C2512
- 错误C2512:没有合适的默认构造函数可用
- 错误C2512,但我有可用的默认构造函数
- 错误C2512:没有合适的默认构造函数可用
- 为什么我得到错误c2512:没有适当的默认构造函数可用
- 错误 C2512:'std::basic_ostream<_Elem,_Traits>':没有适当的默认构造函数可用于仅 Visual Studio
- c++错误c2512:没有可用的默认构造函数
- 错误 C2512:'Tile':没有可用的适当默认构造函数
- 错误C2512:没有合适的默认构造函数可用-如果在构造函数中初始化属性,为什么