gpt4 book ai didi

c++ - 编译器选择了错误的运算符<<

转载 作者:太空狗 更新时间:2023-10-29 20:06:25 24 4
gpt4 key购买 nike

我有两个库,其中一个依赖于另一个。第一个库定义了一些枚举并提供了一个 operator<<() 来为每个枚举打印一小段文本。我有单元测试证明这是可行的。

第二个库依赖于第一个库,将枚举值传递给 std::cout(std::ostringstream 行为相同)并获取相应的数值而不是文本。不涉及模板化代码,因此它不是模板与重载问题。我查看了预处理器输出以验证正确的定义是否可见。我正在使用 g++ 4.1.2。

我无法在我的库(数千行)之外重现该问题,因此我无法发布任何示例代码。我尝试生成示例代码也让我相信我理解它应该如何工作。我猜测其中一个 header 中包含的某些内容导致编译器在选择要使用的运算符<<时做出不同的选择。

我的问题:我如何才能深入了解编译器在选择要使用的运算符版本时有哪些选择,以及为什么选择标准版本而不是我的版本。

编辑:按要求添加签名:请注意,这个简化的示例并未出现问题。

来自第一个库的 header :

namespace utcp {
enum GainType {AGC_GAIN_MODE, MAN_GAIN_MODE };
}

// I've tried this passing the argument by value as well.
inline std::ostream& operator<<(std::ostream &os, const hdr::GainType &val)
{...}

第二个库中的代码

std::cout << "Gain Text: " << hdr::AGC_GAIN_MODE << std::endl;

最佳答案

问题是,其中一条评论提到了参数相关查找问题。当编译器执行查找 std::cout << my_enum_variable 时它将在当前命名空间中查找,在 std 中命名空间和类型所在的命名空间 my_enum_variable被定义为。只有当没有候选者时,它才会向上搜索封闭的命名空间。在这种情况下,因为任何 enum可隐式转换为 int它将应用该转换,而不是查看封闭的 namespace 。 using指令在那里没有帮助。

简单的解决方案是移动重载的 operator<<进入与枚举相同的命名空间:

namespace utcp {
enum GainType {AGC_GAIN_MODE, MAN_GAIN_MODE };
inline std::ostream& operator<<(std::ostream &os, const GainType &val) {...}
}

这应该使 ADL 能够选择您重载。

关于c++ - 编译器选择了错误的运算符<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7980818/

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