Вы используете объект, содержащий ссылку нулевого значения. Таким образом, он дает пустое исключение. В примере строковое значение равно null, и при проверке его длины произошло исключение.
Пример:
string value = null;
if (value.Length == 0) // <-- Causes exception
{
Console.WriteLine(value); // <-- Never reached
}
Ошибка исключения:
Необработанное исключение:
System.NullReferenceException: ссылка на объект не установлена в экземпляр объекта. в Program.Main ()
blockquote>
Если вы хотите сказать
QStrign qs;
UnicodeString us(qs);
или
UnicodeString us;
QString qs(us);
, то нет, вы не можете этого сделать, если не можете изменить либо из классов. Конечно, вы можете ввести новую строку:
NewString ns;
UnicodeString us(ns);
QString qs(us);
NewString nsus(us);
NewString nsqs(qs);
Я не уверен в элегантности этого подхода, хотя по сравнению с вашими двумя явными функциями преобразования.
Вы всегда можете делать именно то, что делаете, но заставляете его больше походить на кастинг. Для этого может быть даже разумный аргумент, например, возможность переопределения для большего количества типов и сохранения того же синтаксиса.
Рассмотрим:
template < typename DestType, typename SourceType >
DestType string_cast(SourceType const& source)
{
return string_cast_impl<DestType,SourceType>::apply(source);
}
template < typename DestType, typename SourceType >
struct string_cast_impl;
template < >
struct string_cast_impl<QString,icu_44::UnicodeString>
{
QString apply(icu_44::UnicodeString const& val) { return MyProject::ToQString(value); }
};
// etc...
Вы можете не использовать struct impl (потому что вам не нужно частично специализироваться ... когда-либо), или вы можете подумать об увеличении его, чтобы вы могли использовать enable_if. Во всяком случае, у вас будет общий интерфейс для преобразования типа строки, так что вам не нужно запоминать, какую функцию вызывать ... просто вызовите string_cast & lt; Dest> (source).
Edit: подумайте об этом, я делаю то, что вы делаете в одном из моих проектов, для преобразования из std :: string в / из std :: wstring. Я думаю, что я воспользуюсь этой альтернативой, чтобы заменить это.
Возможным решением было бы обернуть эти типы и предоставить явные конструкторы преобразования. Я так понимаю, вы не можете изменить источник как QString
, так и icu_44::UnicodeString
, который был бы самым естественным местом для конструкторов преобразования. Использование ключевого слова explicit
запрещает неявное преобразование, поэтому преобразования могут возникать только тогда, когда вы пишете QString converted(original)
с original
значением типа icu_44::UnicodeString
или наоборот.
Единственная проблема с этим подход заключается в том, что вы должны обернуть свои типы данных. Я не знаю, вам когда-нибудь понадобится больше операций над этими типами, которые в настоящее время не представлены в реальных библиотеках, или нет, но если это так, то обертывание - это возможный путь
Боковой вопрос, вы хотите использовать пространство имен 4.4 напрямую, а не только icu :: UnicodeString?