首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >找不到用户定义的getline。自动扣款有问题吗?

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

Stack Overflow用户
提问于 2019-05-12 16:27:49
回答 1查看 32关注 0票数 1

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace pru{
class A{
    friend std::istream& getline(std::istream& in, A& a)
    {
         std::cout << "getline\n";
         return in;
     }
 };

然后像往常一样在main中调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pru::A a;
pru::getline(std::cin, a);

但令人惊讶的是,它不能编译。g++和clang都给出了相同的错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'getline' is not a member of 'pru'

但是如果我调用不带prugetline

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pru::A a;
getline(std::cin, a);

它编译了!为什么?getline是保诚的会员!

EN

回答 1

Stack Overflow用户

发布于 2019-05-12 16:46:44

这个answer应该可以解释所有的事情。我将仅为您的特定示例进行解释。在类中声明/定义的友元函数是封闭名称空间(在本例中为pru)的一部分。但是它们在限定的查找中是不可见的,除非它们至少也在该名称空间中被声明。因为您没有显式地声明它,所以这段代码不会编译:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pru::A a;
pru::getline(std::cin, a);

你有没有这样做过:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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声明。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56101214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文