проблема с перегрузкой оператора
От: SaloS http://salos.narod.ru/
Дата: 19.10.04 08:38
Оценка:
Есть класс
class CMyDelimiter
{
private:
CString m_String;
public:
CSqlDelimiter(CString str):m_String(str){};
CSqlDelimiter(LPCTSTR str):m_String(str){};
CString GetString() const
{
return m_String;
}
};

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

проблема в том, что когда я пытаюсь сделать MyClass m1;m1<<str, где str — CString, то компилятор говорит, что не могу распознать какой оператор нужно вставлять (не может выбрать между первым и третьим). При явном приведении к (LPCTSTR) все нормально. Используется MS VC++ 2003. Заранее благодарен.
WTL Helper и WTL Wizards помощники для WTL, скачать отсюда http://salos.narod.ru
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), что вообще не позволит делать неявные преобразования
Перекуём баги на фичи!
Re[2]: проблема с перегрузкой оператора
От: SaloS http://salos.narod.ru/
Дата: 19.10.04 09:05
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Избежать этого можно разными способами:

К>1) перегрузить operator<<(const CString&)
К>2) передавать в operator<<(const CMyDelimiter&) по ссылке, а не по значению — тогда приведение к const CMyDelimiter& будет длиннее (сперва конструктор, затем rvalue-to-lvalue) и компилятор остановится на первом варианте
К>3) объявить конструктор явным (explicit), что вообще не позволит делать неявные преобразования

Первое не могу сделать, ибо нужно именно так
Второе абсолютно точно не работает, так как проверял еще до постинга.
Третье решение подошло. Спасибо!
WTL Helper и WTL Wizards помощники для WTL, скачать отсюда http://salos.narod.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.