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

时间:2019-05-12 16:27:49

标签: c++ namespaces getline

我在自己的命名空间中定义了一个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 个答案:

答案 0 :(得分:1)

answer应该解释所有内容。我只为您的特定示例提供解释。在类内声明/定义的朋友功能是封闭名称空间的一部分(在本例中为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可以看到好友功能。您可以阅读有关此内容的更多信息,例如here。这基本上意味着,由于参数来自stdpru命名空间,因此也将搜索getline声明。