gpt4 book ai didi

c++ - 模板类析构函数

转载 作者:行者123 更新时间:2023-11-30 02:07:37 25 4
gpt4 key购买 nike

我正在尝试用 C++ 创建一个简单的模板类。我一直在尝试编译以下内容,但只收到编译错误。这是代码:

#include <stdlib.h>
#include <stdio.h>

template<int size>
class array {
public:
int len;
int data[size];
array(void) : len(size) {}
virtual ~array(void) {}
};

int main() {
array<3> a;
for (int i=0; i < a.len; ++i) {
a.data[i] = i;
printf("%d\n", a.data[i]);
}
return 0;
}

这是 g++-4.2.1 给我的错误:

Undefined symbols:
"__Unwind_Resume", referenced from:
_main in ccaYob9x.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

如果我们注释掉析构函数的行,那么代码将按预期进行编译,并为我提供数字 0、1、2 的列表。

在了解模板基类的工作原理后,我的最终目标是创建专门的模板类。我想创建一个多维数组,但我希望专门针对维度为 1、2 和 3 的情况。我主要希望能够为这些情况重载 operator()。无论如何,使用这样的模板类可以省去维度为 1、2 和 3 时动态分配内存的麻烦。有人知道如何更改代码以动态分配内存吗?这样做将需要您定义析构函数,这是我目前面临的问题。

编辑:

我不熟悉模板特化。有人知道如何在 size=1、2 和 3 时制作一个专门的模板来为数据提供静态内存并默认为动态内存吗?

编辑 2:

我的 g++ 编译器似乎遇到了问题。有没有人看到任何与此相关的内容:

g++ -v
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5666.3~6/src/configure --disable-checking --enable- werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple- darwin10 --with-gxx-include-dir=/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5666) (dot 3)

编辑 3:

我的 g++ 版本一定有问题。我只是在同一台机器上用 g++4.0 和 macports 版本 g++-mp-4.3 试了一下,它工作正常。我想是时候升级到下一个版本了。感谢您的回答和提示。

最佳答案

试试这个:

template<int size>
class array {
public:
int len;
int *data;
array();
virtual ~array(void);
};

// 1 dimension specialized array
template <>
array<1>::array() : len(1)
{
data = new int;
}

template <>
array<1>::~array()
{
delete data;
}

template <int size>
array<size>::array() : len(size)
{
data = new int[size];
}

template <int size>
array<size>::~array()
{
delete [] data;
}

int main(int, char)
{
array<3> a;
for (int i=0; i < a.len; ++i) {
a.data[i] = i;
printf("%d\n", a.data[i]);
}

array<1> b;
for (int i=0; i < b.len; ++i) {
b.data[i] = i;
printf("%d\n", b.data[i]);
}

return 0;
}

使用 g++ 你不会有编译错误。您可以毫无问题地为每个不同的数组大小定义专门的 operator(),例如构造函数和析构函数接缝。

关于c++ - 模板类析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7606705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com