gpt4 book ai didi

C++ 'operator>>' 中的 'std::cin >>' 有歧义

转载 作者:搜寻专家 更新时间:2023-10-31 01:48:10 24 4
gpt4 key购买 nike

我正在处理的作业有问题。我们正在编写一个在其自己的命名空间中定义的复数类。除了我的 istream 和 ostream 上的重载外,我的一切都在工作。让我发布一些我的代码:

namespace maths {

class complex_number{
public:

// lots of functions and two variables

friend std::istream& operator >>(std::istream &in, maths::complex_number &input);

}
}

std::istream& operator >>(std::istream &in, maths::complex_number &input)
{
std::cout << "Please enter the real part of the number > ";
in >> input.a;
std::cout << "Please enter the imaginary part of the number > ";
in >> input.b;

return in;
}

int main(int argc, char **argv)
{
maths::complex_number b;
std::cin >> b;

return 0;
}

我收到的错误如下:

com.cpp: In function ‘int main(int, char**)’:
com.cpp:159:16: error: ambiguous overload for ‘operator>>’ in ‘std::cin >> b’
com.cpp:159:16: note: candidates are:
com.cpp:131:15: note: std::istream& operator>>(std::istream&, maths::complex_number&)
com.cpp:37:26: note: std::istream& maths::operator>>(std::istream&, maths::complex_number&)

我花了一些时间仔细阅读这里的论坛,偶然发现了一个关于名称隐藏的答案,但我似乎无法让它与我的代码一起工作。非常感谢任何帮助!

最佳答案

之所以不明确,是因为您有两个独立的功能。一个驻留在 maths 命名空间中,并由类中标记为 friend 的那个声明。这个可以通过参数相关查找找到。您还拥有命名空间之外的完整定义。这两者同样有效。

首先,它不访问类的任何私有(private)成员,因此不需要 friend 声明。只是不要让它成为 friend ,因为那样只会伤害封装。

其次,我建议将定义移动到 maths 命名空间中,因为它与它正在运行的类一起属于那里。如前所述,ADL 仍会找到它,因为第二个参数属于该命名空间中的类型,因此会搜索命名空间并找到重载。

总而言之,你应该得到这样的结果:

namespace maths {

class complex_number{
public:
// lots of functions and two variables
};

std::istream& operator >>(std::istream &in, maths::complex_number &input)
{
std::cout << "Please enter the real part of the number > ";
in >> input.a;
std::cout << "Please enter the imaginary part of the number > ";
in >> input.b;

return in;
}
}

int main(int argc, char **argv)
{
maths::complex_number b;
std::cin >> b; //operator>> found by ADL

return 0;
}

最后要注意的是重载本身。 Input 真的不应该提示输入,它应该只是阅读它们。这样,您就可以将它与键盘、文件或任何其他需要的 std::istream 派生一起使用。

关于C++ 'operator>>' 中的 'std::cin >>' 有歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18245910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com