为什么无法引用和删除模板析构函数?



我正在尝试使用模板类来创建Vector3

我的头文件vector.h定义Vector3结构体:

template <typename T>
struct Vector3 {
union {
struct {
T x, y, z
} xyz;
std::vector<T> values;
};
Vector3() : values(3, 0) {}
Vector3(T x, T y, T z) : xyz{x, y, z} {}
};

但是当我使用指定类型int的这个结构体时,我遇到了错误:

function "Vector3::~Vector3() [with T=int]"(隐式声明)不能被引用——它是一个已删除的函数

我只用了一行:Vector3<int> vertex;.

总代码:我想读波前。obj文件:model.h:

class ObjModel {
private:
std::vector<Vector3<int>> vertices;
public:
explicit ObjModel(const std::string& filename);
};

model.cpp:

ObjModel::ObjModel(const std::string& filename) : vertices() {
std::ifstream in;
in.open(filename.c_str());
std::string line;
while (std::getline(in, line)) {
if (line.empty() || '#' == line[0]) continue;
if ('v' == line[0]) {
std::istringstream iss(line);
iss.ignore(std::numeric_limits<std::streamsize>::max(), ' ');
Vector3<int> vertex; **// here has problem**
int i = 0;
while (iss && 3 > i) {
iss >> vertex.values[i];
++i;
}
vertices.push_back(vertex);
} 
}
}

Vector3<int> vertex行给出错误。

我认为析构函数应该是默认的,不知道为什么要删除它。我还试图通过在vector.h中添加以下代码来显式声明它:

struct Vector3{
...
~Vector3() = default;
...
}

但它没有工作。有人能帮我吗?

如果使用联合,你必须知道你"联合"的类型的确切实现和内存布局,否则你会得到未定义行为(UB)。如果你使用的不是纯旧数据,事情很快就会变得混乱。

是的,自c++ 11以来,您可以指定特定的构造函数或取消删除values构造函数。但要意识到这给你自己和任何阅读你代码的人增加了很多认知负担。但是,在您的矢量示例中,特定的构造函数将无法提供任何帮助。vector是动态分配的,必须至少包含两个变量:一个指向已分配内存的指针和一个长度。这些值与xyz值共享内存。换句话说:将值写入任何xyz成员都会破坏vector的簿记!这会导致各种各样的混乱,包括内存访问违规和内存泄漏。只是不要。

除此之外,通过values[index]访问的值位于动态分配的内存中,并且不与xyz共享相同的内存。所以不要期望values[0]对应于xyz.x,即使你没有得到内存访问冲突。

最新更新