如果我错过了一个解决方案,我已经找到了这个骗局但请原谅我。
我有一个智能指针,有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。谢谢大家,我不知道我怎么没有发现它!奖品是第一个正确答案。
答案 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
。