Здравствуйте, 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), что вообще не позволит делать неявные преобразования