我在一个项目中有一个头文件,我声明了许多结构。后面的一些结构具有成员,这些成员是先前声明的结构的类型。我知道这些成员结构必须在使用之前声明,但我遇到了奇怪的行为。
在下面的文件中,我尝试将新成员添加到(LUT)
类型的第二个结构Coordinate
。你可以看到底层结构libraryEntry
有一个类似的成员;这种情况已经存在了一段时间,并没有造成任何问题。
#ifndef STRUCTS_H
#define STRUCTS_H
#pragma once
#include <string>
#include "Enums.h"
struct Coordinate {
int X;
int Y;
Coordinate(int x, int y) : X(x), Y(y) {}
};
struct LUT {
int offset;
std::string hexCode;
bool modifiedByTrojan;
//Coordinate xyCoordinate; <======= Causes build to fail when uncommented
};
struct libraryEntry {
int id;
DeviceType deviceType;
int offSet;
Coordinate xyCoordinate;
std::string hexCode;
DeviceConfiguration deviceConfig;
libraryEntry(int idNum, DeviceType deviceType, int offSet, Coordinate xyCoordinate, std::string hexCode) :
id(idNum),
deviceType(deviceType),
offSet(offSet),
xyCoordinate(xyCoordinate),
hexCode(hexCode)
{
}
};
#endif
添加上面的坐标成员会导致错误:
'LUT::LUT(void)':attempting to refernce a deleted function
为什么这只发生在第二个结构中?
答案 0 :(得分:4)
在有效的结构(libraryEntry
)中,您已经定义了一个构造函数,并且在构造函数中使用其两个arg构造函数初始化xyCoordinate
。
在无法编译的结构中,您尚未定义任何构造函数,因此您将获得默认的no-arg构造函数,该构造函数使用其默认值(no-arg)初始化所有内容,包括Coordinate
成员构造函数。 Coordinate
没有默认构造函数,因为您声明了一个不同的构造函数,导致默认构造函数被删除,因此您的错误消息。