无法识别的模板声明错误 - 不明白我做错了什么
Unrecognized template declaration error - do not get what am i doing wrong
该类定义的对象是包含任何类型的对象的 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...
}
解决方案:对参数执行某些操作,而不仅仅是丢弃它
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- 什么是非营利组织???我的问题是我不明白为什么有人会使用它
- 什么'!((n % 5 != 0) ||(n % 20 == 0))'变身?为什么呢?我似乎不明白
- 我不明白在这个例子中什么时候调用构造函数
- 尝试使用 Qt 库中的 QPixmap 将图像拆分为多个块。关于他的复制方法的工作方式,我有什么不明白的吗?
- 我不明白我的程序中有什么问题
- 无法识别的模板声明错误 - 不明白我做错了什么
- 不太明白 & 运算符的地址在这个结构中做什么,以及它如何能够访问其他成员变量
- 如何使用 Open MPI 使我的程序更快?我的 Open MPI 程序目前比原来慢,我有什么不明白的?
- 我不明白这句话是什么意思?
- 我不明白析构函数有什么问题?
- 关于将指针作为参数传递,我有什么不明白的?
- 我在板上发现了一个参数包扩展,但我不明白到底发生了什么
- C++ 我不明白我的异常是什么()行为
- 例外C++,我只是不明白为什么输出是什么
- 不太明白是什么:uintptr_t值(astruct.val)
- 我不明白编程中的回报是什么?
- 我不明白在read()方法中要做什么