template <class T, class FPTR = void (void *)>
class CSmartPtr
{
public :
// -----------------------------------------------------------------------
// Constructors and Destructor
// -----------------------------------------------------------------------
CSmartPtr()
{
m_TData = NULL;
m_deleter = NULL;
}
CSmartPtr(T* TData)
{
m_TData = TData;
m_deleter = NULL;
}
CSmartPtr(T* TData, FPTR *deleter)
{
m_TData = TData;
m_deleter = deleter;
}
~CSmartPtr()
{
if (NULL == m_deleter)
{
delete m_TData;
}
else
{
m_deleter(m_TData);
}
}
T *const operator-> () const
{
return m_TData;
}
//-----------------------------------------------------------------------
// Getter methods
//-----------------------------------------------------------------------
T *const get() const
{
return m_TData;
}
void reset(T* TData)
{
if (NULL != m_TData)
{
if (NULL == m_deleter)
{
delete m_TData;
}
else
{
m_deleter(m_TData);
}
}
m_TData = TData;
}
private :
// -----------------------------------------------------------------------
// Private data members
//
// fUnicodeForm
// This is the Unicode XMLCh format of the string.
// -----------------------------------------------------------------------
T *m_TData;
FPTR *m_deleter;
};
int main( void )
{
CSmartPtr<BYTE> apbySrcBuff; // This doesnt work.
CSmartPtr<BYTE, (void) (void *)> apbySrcBuff; // This works.
getchar();
return TRUE;
}
我对templates
完全不熟悉,从几小时开始我就遇到了上述问题。
试图独自解决它,但没有成功。
错误为Error 1 error C2064: term does not evaluate to a function taking 1 arguments
这条线是
m_deleter(m_TData);
答案 0 :(得分:0)
您需要在代码顶部添加以下内容:
#include <cstdio>
typedef char BYTE;
bool TRUE = true;
并在评论出你的一个相同之后:
CSmartPtr apbySrcBuff;
行,它都编译。
答案 1 :(得分:0)
我测试了它at ideone并且运行正常(它以运行时错误终止,但那就是你的smart_ptr实现,我没有调试过)。
我发现的唯一问题是第二个声明使用额外的parens,(void)(void*)
并且编译失败( 我对第一个声明没有问题 )。