Re: проблема с перегрузкой оператора
От: Кодт Россия  
Дата: 19.10.04 08:55
Оценка:
Здравствуйте, SaloS, Вы писали:

SS>Есть класс

SS>class CMyDelimiter
SS>{
SS>private:
SS>    CString m_String;
SS>public:
SS>    CSqlDelimiter(CString str):m_String(str){};
SS>    CSqlDelimiter(LPCTSTR str):m_String(str){};
SS>    CString GetString() const
SS>    {
SS>        return m_String;
SS>    }
SS>};

SS>и есть другой класс у которого перегружен оператор <<, то есть
SS>MyClass& operator<<(LPCSTR value);
SS>MyClass& operator<<(const BSTR value);
SS>MyClass& operator<<(const CMylDelimiter value);

SS>проблема в том, что когда я пытаюсь сделать MyClass m1;m1<<str, где str — CString, то компилятор говорит, что не могу распознать какой оператор нужно вставлять (не может выбрать между первым и третьим). При явном приведении к (LPCTSTR) все нормально. Используется MS VC++ 2003. Заранее благодарен.

Потому что перед компилятором стоит выбор — выполнить приведение к CMyDelimiter через конструктор, или выполнить приведение к LPCSTR через оператор.
Избежать этого можно разными способами:
1) перегрузить operator<<(const CString&)
2) передавать в operator<<(const CMyDelimiter&) по ссылке, а не по значению — тогда приведение к const CMyDelimiter& будет длиннее (сперва конструктор, затем rvalue-to-lvalue) и компилятор остановится на первом варианте
3) объявить конструктор явным (explicit), что вообще не позволит делать неявные преобразования
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.