gpt4 book ai didi

C++重载函数名查找错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:44:35 24 4
gpt4 key购买 nike

我在 C++ 中遇到有关名称查找的奇怪错误。

可以使用以下最小示例重新创建错误:

#include <vector>
#include <iostream>

std::ostream& operator<<(std::ostream& out, const std::vector<int>& a) {
for (size_t i = 0; i < a.size(); i++) {
out << a[i] << std::endl;
}
return out;
}

namespace Test {

struct A {
// Label 1
friend std::ostream& operator<<(std::ostream& out, const A&) {
return out << "A" << std::endl;
}
};

struct B {
void printVector() noexcept {
std::vector<int> v{1, 2, 3};
std::cout << v << std::endl; // The error occurs in this line
}
// Label 2
friend std::ostream& operator<<(std::ostream& out, const B&) {
return out << "B" << std::endl;
}
};

}

int main() {
Test::B().printVector();
}

编译这将导致以下错误消息:

cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'

您可以在这里自行测试:http://cpp.sh/5oya

奇怪的是,如果您分别删除标有 //Label 1//Label 2 的函数之一,代码编译并运行良好。

我现在的问题是:这是怎么回事?如何修复?

最佳答案

其他解决方法是在命名空间 std 中重载运算符 <<,而不是在全局命名空间中。(查找将在命名空间范围内找到它)

namespace std
{
std::ostream& operator<<(std::ostream& out, const std::vector<int>& a) {
for (size_t i = 0; i < a.size(); i++) {
out << a[i] << std::endl;
}
return out;
}
}

尝试 Here

[编辑]

另一种解决方法,对于不想污染全局命名空间或 std 的清教徒来说,是

...have the insertion operators in the same namespace as the class upon which it operates.

...讨论 here .

namespace Test
{
std::ostream& operator<<(std::ostream& out, const std::vector<int>& a) {
for (size_t i = 0; i < a.size(); i++) {
out << a[i] << std::endl;
}
return out;
}
}

工作代码 here .

关于C++重载函数名查找错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41621296/

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