我在自己的命名空间中定义了一个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的成员!
答案 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。这基本上意味着,由于参数来自std
和pru
命名空间,因此也将搜索getline
声明。