模板类构造函数中的动态分配

Posted

技术标签:

【中文标题】模板类构造函数中的动态分配【英文标题】:Dynamic Allocation in Template Class Constructor 【发布时间】:2012-09-14 11:45:41 【问题描述】:

我正在研究一个堆栈类并且有两个构造函数。有趣的是这个。

template <typename T>
stack<T>::stack( const int n)

 capacity = n ;
 size = 0 ;
 arr = new T [capacity] ;

我在 main 中这样调用它。

stack<int> s1(3) ;

程序编译正常,但我得到这个运行时错误。

1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall
 stack<int>::~stack<int>(void)" (??1?$stack@H@@QAE@XZ) referenced in function _main

1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall    
stack<int>::stack<int>(int)" (??0?$stack@H@@QAE@H@Z) referenced in function _main

1>D:\\Microsoft Visual Studio 10.0\Visual Studio 2010\Projects\Expression
 Evaluation\Debug\Expression Evaluation.exe : fatal error LNK1120: 2 unresolved externals

我正在处理Microsoft visual studio 2010,这个问题让我无处可去。 任何提示将不胜感激。

【问题讨论】:

【参考方案1】:

这不是运行时错误,而是链接器错误。问题可能是构造函数和析构函数的实现在源文件中。使用模板类,您必须将所有方法的实现放在头文件中(或在使用它们的源文件中,但这相当于将它们放在头文件中)。

所以基本上这样做:

template<class T>
class stack

public:
    stack( const int n)
    
        capacity = n ;
        size = 0 ;
        arr = new T [capacity] ;
    

    // and the same for all other method implementations
;

【讨论】:

这与常规类不同,因为编译器需要在模板类使用 (main.cpp)的地方生成代码,而不是在实现(即stack.cpp),因为只有实例化模板的代码知道它将使用什么具体类型。 好的,谢谢,效果很好。以及@willglynn 的原因。

以上是关于模板类构造函数中的动态分配的主要内容,如果未能解决你的问题,请参考以下文章

动态内存管理2

第十二章 类和动态内存分配

动态分配的双向链表类实例 segfault C++

避免使用 Eigen 分解稀疏矩阵时的动态内存分配

类和动态内存分配

调整动态分配的指针数组的大小(复制构造函数不起作用?)