【发布时间】:2016-02-19 10:37:50
【问题描述】:
我有一个流式基类:
class Stream
{
virtual Stream& operator<< ( float num ) = 0;
virtual Stream& operator<< ( double num ) = 0;
virtual Stream& operator<< ( bool val ) = 0;
};
然后我实现一个实现类:
class StreamImpl : public Stream
{
Stream& operator<< ( float num ) { ... do stuff ... }
Stream& operator<< ( double num ) { ... do stuff ... }
Stream& operator<< ( bool val ) { ... do stuff ... }
};
然后对于新类,我创建我的非成员流运算符函数:
class Blar { };
Stream& operator<< ( Stream& str, const Blar& blar ) { ... do stuff ... }
一切正常,花花公子。但我有一个问题,在某些情况下编译器不知道使用哪个流操作符。
考虑 Blar 何时具有强制转换运算符:
class Blar
{
operator bool() const { return false; }
};
现在我尝试使用流:
void process( Stream& str )
{
Blar blar;
str << blar;
}
所以这里的问题是编译器不知道是否应该将 Blar 转换为 bool,然后使用 Stream 成员,或者将 str 转换为 Stream 类型,并使用非成员流运算符。
有没有办法确定演员表的优先级?
【问题讨论】:
-
制作
operator bool()函数explicit。 -
很好的答案——它会起作用——但在这种情况下,我仍然希望隐式转换起作用。我只是希望它的优先级较低。
-
应该可以。可能是你的编译器有问题。在ideone.com/GoHnd8 上查看它。它也可以在 cygwin/g++ 4.9.3 下运行。
-
我确定确实如此。但是,如果我添加显式,那么每次我希望强制转换发生时我都必须手动进行转换,对吗?我写了“bool b = (bool)blar;”,对吧?
-
对。我正在寻找“bool b = blar;”的解决方案仍然可以工作。
标签: c++ inheritance virtual-inheritance