Не могу найти пользовательское определение getline.Проблемы с автоматическим удержанием? - PullRequest
1 голос
/ 12 мая 2019

Я определил getline функцию в своем собственном пространстве имен:

namespace pru{
class A{
    friend std::istream& getline(std::istream& in, A& a)
    {
         std::cout << "getline\n";
         return in;
     }
 };

И затем вызываю ее в основном как обычно:

pru::A a;
pru::getline(std::cin, a);

Но на удивление она не компилируется,И g ++, и clang выдают одну и ту же ошибку:

'getline' is not a member of 'pru'

Но если я позвоню getline без pru:

pru::A a;
getline(std::cin, a);

, он компилируется !!!Зачем?getline является участником pru!

1 Ответ

1 голос
/ 12 мая 2019

Этот ответ должен все объяснить. Я просто объясню ваш конкретный пример. Дружественные функции, которые объявлены / определены внутри класса, являются частью окружающего пространства имен (в данном случае pru). Но они не видны (не) квалифицированным поиском, если они по крайней мере не объявлены в этом пространстве имен. Поскольку вы не объявили это явно, этот код не будет компилироваться:

pru::A a;
pru::getline(std::cin, a);

Если бы вы сделали это:

namespace pru{
class A{
    friend std::istream& getline(std::istream& in, A& a)
    {
         std::cout << "getline\n";
         return in;
     }
 };
 std::istream& getline(std::istream& in, A& a);//Can be placed anywhere in pru.
}

Выше может также работать. В ответе говорится, что функции друзей видны в ADL. Вы можете прочитать больше об этом, например. здесь . В основном это означает, что, поскольку аргументы взяты из пространств имен std и pru, тогда они также ищут объявление getline.

...