由于错误C2244导致智能指针模板操作符重载失败:“无法将函数定义与现有声明匹配”

时间:2011-03-29 11:02:46

标签: c++ visual-studio-2008 templates visual-c++

如果我错过了一个解决方案,我已经找到了这个骗局但请原谅我。

我有一个智能指针,有2个比较重载,“==”和“<”。这两个都只在底层指针上运行(在我受到惩罚之前继承代码)。但是在编译时我得到了两个C2244错误。我将仅介绍相等运算符的情况,因为另一个几乎完全相同:

  

错误4错误C2244:'SmartRef :: operator ==':无法将函数定义与现有声明匹配q:\ projs \ ha \ src \ SmartRef.cpp 114

以下代码在VC4.2中工作正常(我正在移植到VC2008 ......勇气)。

SmartRef.h

#ifndef HA_INCL_REFERENCE
#define HA_INCL_REFERENCE 1

template <class TypeRefObj>
class SmartRef
{
public:

    //@cmember Default constructor
    inline SmartRef();

    //@cmember Constructor
    inline SmartRef( TypeRefObj * pThePointer );

    //@cmember Destructor
    inline ~SmartRef();

    //@cmember Copy constructor
    inline SmartRef( const NIEB_clReference< TypeRefObj > & roTheValue );

    //@cmember
    inline const SmartRef< TypeRefObj > & operator= ( const SmartRef< TypeRefObj > & roTheValue );

    //@cmember
    inline SmartRef< TypeRefObj > & operator= ( const SmartRef * pTheValue );

    //@cmember
    inline int operator== ( const SmartRef< TypeRefObj > & roTheValue ) const;

    //@cmember
    inline int operator< ( const SmartRef< TypeRefObj > & roTheValue ) const;

    //@cmember
    inline TypeRefObj & operator* () const;

    //@cmember
    inline TypeRefObj * operator-> () const;

private:
    //@cmember Reference pointer
    TypeRefObj * m_pRefPointer;
};
#include "SmartRef.cpp"
#endif //HA_INCL_REFERENCE

SmartRef.cpp

template <class TypeRefObj> 
inline int SmartRef< TypeRefObj >::operator== 
    ( SmartRef< TypeRefObj > & roTheValue ) const
{
    return m_pRefPointer == roTheValue.m_pRefPointer;
}

我的第一个想法是存在一个问题,因为在专业类中没有比较,但后来我意识到我在比较指针而不是对象。然后我想也许我需要对此非常明确,所以我将比较的两个方面都称为“void *”,但这没有任何区别。所以现在我认为有一些理由认为这个定义在VC 2008中是无效的。但我不能为我的生活找出定义的错误。

非常感谢任何帮助。 谢谢, 丹尼斯。

* 编辑: *我很尴尬,这很简单。我从定义中遗漏了一个const。谢谢大家,我不知道我怎么没有发现它!奖品是第一个正确答案。

3 个答案:

答案 0 :(得分:2)

您已从SmartPtr.cpp中的函数中省略了const

template <class TypeRefObj> 
inline int SmartRef< TypeRefObj >::operator== ( const SmartRef< TypeRefObj > & roTheValue ) const
{
    return m_pRefPointer == roTheValue.m_pRefPointer;
}

作品

答案 1 :(得分:1)

您在定义中缺少const

template <class TypeRefObj> 
inline int SmartRef< TypeRefObj >::operator== 
    ( const SmartRef< TypeRefObj > & roTheValue ) const

此外,您应该在.cpp的标题 - #include中定义成员函数,就像您在可读性方面没有做太多工作一样。

答案 2 :(得分:1)

模板不属于.cpp文件,它们也属于标题,因为编译器需要知道完整代码来实例化它的模板。然后,您错过了const定义中的operator==。此外,所有比较运算符都应返回bool,而不是int