使用模板的默认值时出错

时间:2013-08-23 11:08:24

标签: c++ templates smart-pointers

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);

2 个答案:

答案 0 :(得分:0)

您需要在代码顶部添加以下内容:

#include <cstdio>

typedef char BYTE;
bool TRUE = true;

并在评论出你的一个相同之后:

CSmartPtr apbySrcBuff;

行,它都编译。

答案 1 :(得分:0)

我测试了它at ideone并且运行正常(它以运行时错误终止,但那就是你的smart_ptr实现,我没有调试过)。

我发现的唯一问题是第二个声明使用额外的parens,(void)(void*)并且编译失败( 我对第一个声明没有问题 )。