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();
Проблема в том, что транслятор трактует строку `friend std::string ::convert()' как `friend std::string::convert()', что очеведно не то что было задумано. В голову приходит что-то типа такого решения (при условии, что существующий дизайн изменять нельзя и в пространстве имен `tools' также может оказаться объявление функции `std::string convert()'):
ОтветитьУдалитьstd::string convert();
// ...
namespace tools {
namespace global_decl {
using ::convert;
}
class Numeric {
// ...
friend std::string global_decl::convert();
};
}
Ошибка именно в этом, но дополнительное пространство вводить не хочется.
ОтветитьУдалитьТогда вот так (хотя мне предыдущий способ больше нравится):
ОтветитьУдалитьstd::string convert();
// ...
namespace tools {
class Numeric {
friend std::string const ::convert();
};
}
Хотя вместо `const' возможно логичнее использовать `volatile', но это уже дело вкуса...
ОтветитьУдалитьconst (как и volatile) нельзя писать, т.к. это уже получается другая функция.
ОтветитьУдалить