Здравствуйте, wander, Вы писали:
MSV>>HLString : public LString MSV>>в LString есть operator MString().
MSV>>--- MSV>>теперь вызывается с (MString&)lsret; но это как вы можете увидеть явный вылет, зато гцц не ругается. MSV>>operator MString() -> MString& -> неверный указатель на память.
W>Покажите хотя бы кусок цельного кода. Так не ясно что вы пытаетесь сотворить.
MSV>>Вызов при котором даже в студия вылетает, что естественно: MSV>>Drawn((MString&)(HLString()+"Uncnown command '"+comm+"'\r\n\r\n"));
W>Покажите как operator+ реализован.
Кода много, не знаю, что именно показывать.
В данном случае единственный вариант реализации operator+ может быть:
HLString& operator+(const MString& string){...}
Это строковый класс, он прибавляет текст у уже записанному в нем.
Собственно тут все просто, класс собирает текст в строку и возвращает ее через operator MString().
Кстати этот код работает:
Drawn((HLString()+"Uncnown command '"+comm+"'\r\n\r\n").operator MString());
Но я за то, чтобы компилятор сам догадывался о типах и не нужно было дописывать .operator MString().
В Drawn текст ждут в виде const MString&.
Все просто.
В случае:
Drawn((MString)(HLString()+"Uncnown command '"+comm+"'\r\n\r\n"));
гцц не понимает указания.
По идее главная ошибка в том, что гцц не понимает, в каком типе передавать из HLString& в MString.
У HLString есть:
operator MString();
operator char*();
Этакая слепота. Ну не могу поверить, что он не может понять, что нужно передать из HLString& 'operator MString()' в MString 'MString(const MString&)'.
Варианты для гцц также мучил в студии. Все нормально понимаются. Жесткое следование стандартам — зло.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?