说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

关于自己写智能指针类模板的严重问题,请大虾帮忙!

编辑:说三道四文库 发布时间:2018-08-17 06:06
HTML文档下载 WORD文档下载 PDF文档下载
我自己写了一个类CSomeClass,另外又写了一个智能类模板smart,可是当用SmartPtr<CSomeClass> ptr时候出错如下: 请帮忙~~~

//CSomeClass.h//

class CSomeClass
{
public:
CSomeClass(void);
~CSomeClass(void);

};

//CSomeClass.cpp//

CSomeClass::CSomeClass(void)
{
  
}

CSomeClass::~CSomeClass(void)
{
}
---------------------
//SmartPtr.h//

template <class T>
class SmartPtr
{
private:
T *Pp;

public:
SmartPtr(void);
~SmartPtr(void);
T * operator ->();

};


//SmartPtr.cpp//

#include "StdAfx.h"
#include ".\smartptr.h"

template<class T> SmartPtr<T>::SmartPtr(void)
{
Pp=new T;
}

template<class T> SmartPtr<T>::~SmartPtr(void)
{
delete Pp;
}

template<class T>T *SmartPtr<T>::operator->() 
{
return Pp;
}
-------------------------

在调用这个类模板的时候,我在头文件声明了引用,
#include "SmartPtr.h"
#include "SomeClass.h"

然后SmartPtr<CSomeClass> ptr,在link时候出现错误了:)

li error LNK2019: unresolved external symbol "public: __thiscall SmartPtr<class CSomeClass>::~SmartPtr<class CSomeClass>(void)" (??1?$SmartPtr@VCSomeClass@@@@QAE@XZ) referenced in function "public: void __thiscall CliDlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CliDlg@@QAEXXZ)

li error LNK2019: unresolved external symbol "public: __thiscall SmartPtr<class CSomeClass>::SmartPtr<class CSomeClass>(void)" (??0?$SmartPtr@VCSomeClass@@@@QAE@XZ) referenced in function "public: void __thiscall CliDlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CliDlg@@QAEXXZ)

在线等待~~~~~~~~~~谢谢了
把函数内联吧
楼上能说说为什么吗?我试了但是不好使,
加上inline关键字,如下:
template<class T> 
inline SmartPtr<T>::SmartPtr(void)
{
Pp=new T;
}

template<class T> 
inline SmartPtr<T>::~SmartPtr(void)
{
delete Pp;
}

template<class T>
inline T *SmartPtr<T>::operator->() 
{
return Pp;
}

然后将这些代码放在SmartPtr.h里面。
去掉Smartptr.cpp文件。
模板类的成员方法定义和模板类的申明必须在同一个文件里!
你申明在.h中,定义在.cpp中,所以出有link error。

只有模板类有这个限制,普通的类没有。至于为什么有这个限制,你可以参考一下C++ Primer中的相关章节
如果你不是用VC++ .Net提供的编译器,改用EDG公司的编译器,这样的问题就能得到解决了

分离编译目前只有EDG公司的编译器可以支持。除了以上的内联模板成员函数的定义以外,还可以用显式模板实力化来解决这样的问题。

譬如template SmartPtr<int>;
这样就可以实例化一个模板类型参数为int的SmartPtr模板。这样的话如果你后面使用了SmartPtr<int>的话,就不会出现未解析的符号这个链接错误的(另外提一句,某些编译器为了更好的使用这种技术还特意给编译器加上了某些参数用来关闭隐式模板实例化)。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘