gpt4 book ai didi

C++重载运算符解析

转载 作者:太空宇宙 更新时间:2023-11-04 15:27:53 24 4
gpt4 key购买 nike

g++ 4.4.5

我有一个扩展类 std::ofstream 以添加一些功能的类。

 MyStream& MyStream::operator<<(const bool& val) {
if(this->pos == 8) {
this->pos = 0;
ofstream::operator<<(this->curbyte); //call the parent method
}
curbyte = curbyte + (val << pos++);
return *(this);
}

基本上允许您将单个位写为 bool 值,然后它将使用父 << 方法写入每组 8。我不得不在这里使用这种调用语法,因为我正在调用基本方法,但在我使用此类的实际主要方法中,我尝试调用以下行:

bout << (unsigned char) 255u;

我想调用已经为 ofstream 和 unsigned char 定义的 << 方法,但它给了我一个很长的模糊重载错误,列出了已经为 ofstream (char, unsigned char, signed char) 和我定义的所有与 char 相关的候选者自己的 bool 方法,即使我明确地转换为 char。但是我确实设法让它与以下内容一起工作:

bout.operator<<((unsigned char) 255u);

这一定与 g++ 如何进行隐式转换有关(我的猜测是在第一种情况下我的用户定义的转换之后还有一个可能的转换,这使得函数调用语法避免了歧义)。有谁知道为什么会发生这种情况,或者是否有更好的语法来避免错误?

最佳答案

operator<<std::ostream定义为成员函数的不是 virtual .你的operator<<隐藏此函数的所有基类版本,因此它们对于重载解析不可见。然而,operator<<定义为自由函数的函数是可见的。

operator<<需要 char , unsigned charsigned char都是免费的功能。

这意味着在 bout << (unsigned char) 255u您的成员函数和自由函数采用 unsigned char对于重载解析,两者都是可见的。

unsigned char 调用自由函数,您的类实例必须绑定(bind)到对基类的引用,这算作“转换”,但右侧不需要转换。要调用您的成员函数,unsigned char必须转换为 bool - 再次是“转换”,但左侧不需要转换。这些转换序列中没有一个比另一个更好,因此调用不明确。

关于C++重载运算符解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4162302/

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