找不到用户定义的 getline。自动扣款有问题?



我在我自己的名称空间内定义了一个 getline函数:

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

,然后像往常

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

,但令人惊讶的是,它没有编译。G 和Clang都给出了相同的错误:

'getline' is not a member of 'pru'

但是,如果我在没有pru的情况下致电getline

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

它编译了!!!为什么?Getline是PRU!

的成员

此答案应该解释一切。我将为您的特定示例提供解释。在类中声明/定义的朋友函数是封闭名称空间的一部分(在这种情况下为pru(。但是(联合国(合格的查找并不可见,除非它们至少在该名称空间中被宣布。由于您没有明确声明它,因此该代码不会编译:

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

您是否这样做:

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

以上也可以起作用。正如答案时,ADL可以看到朋友的功能。您可以阅读更多有关它的信息这里。这基本上意味着由于参数来自stdpru名称空间,因此他们还将搜索getline声明。

最新更新