无法识别的模板声明错误 - 不明白我做错了什么

Unrecognized template declaration error - do not get what am i doing wrong

本文关键字:明白 什么 错了 错误 识别 声明      更新时间:2023-10-16

该类定义的对象是包含任何类型的对象的 DIMXDIM 动态二维数组。 我添加了 c'tor、d'tor、运算符 =、运算符 (),它允许我获取 (2,5) 列/行的值。 以及演示 T 从浮点型和复数类型的动作的主。

我试图改变c'tor的声明,但我认为这不是问题所在。 我真的迷路

#include<iostream>
#include<cassert>
using namespace std;
//#define DIM 3

template<class T, int DIM>
class Array {
T **p;
public:
template<class T, int DIM>
class Array(T** p) {
p = new T*[DIM];
assert(p != NULL);
for (int i = 0; i < DIM; i++)
{
p[i] = new T[DIM];
assert(p[i] != NULL);
}
for (int i = 0; i < DIM; i++) {
for (int j = 0; j < DIM; j++) {
p[i][j] = 3;
}
}
}
template<class T, int DIM>
class ~Array() {
for (int i = 0; i < DIM; i++) {
delete[]p[i];
}
delete[]p;
}
template<class T, int DIM>
Array& operator=(const Array& other) {
if (this != other) {
for (int i = 0; i < DIM; i++) {
delete[]p[i];
}
delete[]p;
this.p = new T*[DIM];
assert(p != NULL);
for (int i = 0; i < DIM; i++)
{
p[i] = new T[DIM];
assert(p[i] != NULL);
}

for (int i = 0; i < DIM; i++) {
for (int j = 0; j < DIM; j++) {
p[i][j] = other.p[i][j];
}
}
}
}
};
int main() {
Array<int, 3> ob[][];
return 0;
}

E0065 预期为";" 不允许项目 C:\用户\Lorine E0070 不完整类型 E0098 数组可能没有此类型的元素 C2988 无法识别的模板声明/定义
C2059 语法错误:"类型">
C2334 "{"前面的意外标记; 跳过明显的函数体 C2332 "类":缺少标记名称
C3306 ":不允许使用未命名的类模板
C2988 无法识别的模板声明/定义 C2143 语法错误:在"~"之前缺少";">

有一些单独的错误,但我们将一一介绍。

问题。这是定义构造函数的错误语法。看起来您同时定义了类和函数,编译器发现这非常令人困惑。

template<class T, int DIM>
class Array(T** p) {
// stuff...
}

校正。我们已经将T定义为模板参数,因此不需要重新定义它。它应该是

Array(T** p) {
// stuff...
}

问题。析构函数永远不应该被模板化,你不应该在它前面放"class":

template<class T, int DIM>
class ~Array() {
for (int i = 0; i < DIM; i++) {
delete[]p[i];
}
delete[]p;
}

校正。只需删除template<class T, int DIM>class

~Array() {
for (int i = 0; i < DIM; i++) {
delete[]p[i];
}
delete[]p;
}

问题。运算符之前=不必要的模板。仅当输入类型取决于模板时,才需要模板化=运算符。

template<class T, int DIM>
Array& operator=(const Array& other) {
// stuff...
}

校正。我们可以只是 删除template<class T, int DIM>,因为它是不必要的。

Array& operator=(const Array& other) {
// stuff...
}

问题。您声明的是一个多维 c 样式数组,但没有指定维度(当用作局部变量时,c 样式数组必须在声明它们时指定其所有维度(或除第一个维度之外的所有维度)。

int main() {
Array<int, 3> ob[][];
return 0; 
}

溶液。要么指定数组的维度,要么不使用 c 数组。(我不知道哪一个适合您的需求。如果您发布更多信息,我可以更新答案以澄清)

问题。没有默认构造函数

溶液。public之后添加一个默认构造函数:

// stuff...
public:
Array() {
p = new T*[DIM]; 
// More stuff...
}

问题。立即丢弃Array(T** p)构造函数中的参数:

Array(T** p) {
p = new T*[DIM]; // WTF?? Whatever parameter was passed gets thrown out the window
assert(p != NULL);
// stuff... 
}

解决方案:对参数执行某些操作,而不仅仅是丢弃它