вторник, 2 марта 2010 г.

Explicitly qualified name

Вчера наткнулся на интересную проблему. Рассмотрим следующий пример:
std::string convert();
// ...
namespace tools {
class Numeric {
// ...
friend std::string ::convert();
};
}
При компиляции этого кода компилятор выдает ошибку. Что тут не так и как исправить положение? Ответ и пояснение чуть позже.



Ошибка тут в том, что компилятор парсит этот код как std::string::convert, как правильно заметил ztonix в комментариях. К сожалению избавиться от :: нельзя, т.к. без точек мы декларируем функцию tools::convert и пометим её как friend.

Решением проблемы будет использовать скобки для выделения имени функции:
friend std::string (::convert)();
Стоит отметить, что со встроенными типами таких проблем нет. Компилятор однозначно воспринимает friend int ::convert();

Комментировать в ВКонтакте