вторник, 21 июня 2011 г.

operator& (address-of)

C++ позволяет переопределять в своих классах ряд операторов, и в их числе — оператор взятия адреса. Попробуем воспользоваться этой возможностью:
struct useless_type {};
class nonaddressable {
  useless_type operator&() const;
};
Пример класса, где переопределен operator& — это CComPtr.

Теперь, если попробовать взять адрес экземпляра класса nonaddressable, то получим ошибку:
nonaddressable* xpe = &x; /* error */
Ошибка может возникнуть по двум причинам: во-первых, в примере оператор взятия адреса приватный, во-вторых — он возвращает экземпляр useless_type, а вовсе не указатель на nonaddressable.

Для разрешения этой ситуации в C++ существует крайне кривой механизм. Можно написать следующий код:
nonaddressable* xp = 
  reinterpret_cast<nonaddressable*>( &reinterpret_cast<char&>( x ) );
Стандарт гарантирует, что это будет работать, но выглядит все равно ужасно. К счастью, в библиотеке Boost существует обертка над этим механизмом — функция boost::addressof, которая учитывает возможные const-volatile. Пользоваться просто:
nonaddressable* xp = boost::addressof(x);

четверг, 16 июня 2011 г.

Ошибка сети в Empathy

С 10 июня Empathy, стандартный мессанджер в Ubuntu 11.04, начал выдавать сообщение Ошибка сети (или Network error в английской версии) при попытке подключения аккаунта ICQ. Странно, что поиск в Google выдает кучу решений, которые не работают в версии 11.04.

Проблема описана в баг-трэкере Empathy (ошибка №795932). Если то, что выдает поиск Google не помогает, то решается путем написания в консоли следующих команд:
user@home:~$ mc-tool list | grep icq
Выдается что-то типа haze/icq/_31102050910. То, что выдалось подставляем в следующие команды:
user@home:~$ mc-tool update haze/icq/_31102050910 string:encryption=no_encryption
user@home:~$ mc-tool update haze/icq/_31102050910 bool:use-clientlogin=0
Перезапускаем Empathy и все работает. Если нет, то отписываемся в баг-трэкере.