Сбой перегрузки оператора шаблона смарт-указателя из-за ошибки C2244: «невозможно сопоставить определение функции с существующим объявлением» - PullRequest
0 голосов
/ 29 марта 2011

Я искал дубликаты этого, но простите меня, если я пропустил решение.

У меня есть умный указатель, который имеет 2 перегрузки сравнения: "==" и "<".Оба они работают только с указателем (унаследованный код до того, как меня отчитали).Однако при компиляции я получаю ошибку C2244 для обоих.Я представлю случай только для оператора равенства, поскольку другой почти такой же: </p>

Ошибка 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 ]

2 голосов
/ 29 марта 2011

Вы исключили const из функции в SmartPtr.cpp

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

Работает

1 голос
/ 29 марта 2011

Шаблоны не принадлежат файлу .cpp, они также принадлежат заголовку, потому что компилятору необходимо знать полный код, чтобы создавать его шаблоны.Тогда вам не хватает const в определении вашего operator==.Кроме того, все операторы сравнения должны возвращать bool, а не int.

1 голос
/ 29 марта 2011

Вам не хватает const в определении.

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

Кроме того, вы должны определить функции-члены в заголовке - #include .cpp, как вы этого не делаетемного для удобочитаемости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...