我在我自己的名称空间内定义了一个 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可以看到朋友的功能。您可以阅读更多有关它的信息这里。这基本上意味着由于参数来自std
和pru
名称空间,因此他们还将搜索getline
声明。