gpt4 book ai didi

c++ - 使用标准类型的 ADL 无法找到运算符

转载 作者:可可西里 更新时间:2023-11-01 17:44:26 25 4
gpt4 key购买 nike

以下代码编译失败

namespace A {
using C = std::vector<std::string>;
std::ostream& operator << (std::ostream& lhs, const C& rhs) {
lhs << 5;
return lhs;
}
}
int main()
{
A::C f;
std::cout << f;
return 0;
}

错误

Error   C2679   binary '<<': no operator found which takes a right-hand operand of type 'A::C' (or there is no acceptable conversion)   

显然,它找不到 << 运算符,大概是因为将 C 视为来自 std 命名空间的类。有什么方法可以确保编译器找到此运算符或以其他方式解决该问题?

最佳答案

A::C只是一个类型别名,别名是透明的。他们不“记得”他们来自哪里。当我们进行依赖于参数的查找并弄清楚关联的命名空间是什么时,我们只考虑类型的关联命名空间——而不是让我们到达那里的别名。您不能只将关联的 namespace 添加到现有类型。 f的具体关联命名空间(属于 std::vector<std::string> 类型)是 std ,它没有 operator<<与之相关。因为没有 operator<<普通查找找不到,ADL也找不到,调用失败。

现在,我说过您不能只将关联的 namespace 添加到现有类型。但是您当然可以创建新类型:

namespace A {
struct C : std::vector<std::string> { };
}

或:

namespace A {
// template parameters are also considered for associated namespaces
struct S : std::string { };
using C = std::vector<S>;
}

关于c++ - 使用标准类型的 ADL 无法找到运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43253306/

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