mat*_*man 0 c++ iostream overloading resolution operator-keyword
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);
}
Run Code Online (Sandbox Code Playgroud)
这基本上允许你将单个位写为bool然后它将使用父<<方法写入每组8.我不得不在这里使用这个调用语法,因为我正在调用基本方法,但在我使用这个类的实际main方法中,我尝试调用以下行:
bout << (unsigned char) 255u;
Run Code Online (Sandbox Code Playgroud)
我想要调用<<方法已经为ofstream和unsigned char定义了但是它给了我一个很长的模糊的重载错误,列出了已经为ofstream定义的所有char相关的候选者(char,unsigned char,signed char)和我自己的bool方法,即使我明确地转向char.但是我确实设法让它与以下工作:
bout.operator<<((unsigned char) 255u);
Run Code Online (Sandbox Code Playgroud)
这必须与g ++如何进行隐式转换有关(我的猜测是在第一种情况下我的用户定义的转换之后还有一次可能的转换,这使得函数调用语法避免不明确).有没有人确切知道为什么会发生这种情况,或者是否有更好的语法来避免错误?
被定义为成员函数的operator<<in std::ostream不是virtual.您operator<<隐藏了此函数的所有基类版本,因此它们在重载解析时不可见.但是,operator<<定义为自由函数的是可见的.
该operator<<内搭char,unsigned char并且signed char都是免费的功能.
这意味着在bout << (unsigned char) 255u您的成员函数和自由函数unsigned char中,可以看到重载决策.
要调用自由函数unsigned char,您的类实例必须绑定到对基类的引用,这将被视为"转换",但右侧不需要转换.要调用您的成员函数,unsigned char必须将其转换为bool- 再次转换为"转换",但左侧不需要转换.这些转换序列都不比另一个更好,因此调用是模糊的.