我有一个名为Log的类,它会重载运算符<<:
class Log
{
public:
static void init(std::ostream&);
Log(const std::string&);
~Log(); //Write to the log here
Log& operator<<(bool);
Log& operator<<(const std::string&);
private:
std::stringstream text;
static std::ostream *stream;
std::string tag;
};
好的,这是问题,当我写这样的日志时:
int main()
{
std::ofstream file;
file.open("log.txt",std::ios::app);
Log::init(file);
Log("[INFO]") << "Test";
file.close();
}
运营商&lt;&lt;收到一个bool被调用,写入日志...,如果我删除接收bool的运算符实现,则正确调用另一个。 我认为这是因为char *可以被解释为bool ......但是我该如何解决它?
答案 0 :(得分:4)
创建第三个operator<<
重载,其中包含char *
参数。
我认为您对问题的分析可能是正确的,尽管令人惊讶。
答案 1 :(得分:3)
有两种可能的<<
运算符,一种采用std::string
,另一种采用bool
。第一个需要用户定义的转换,从std::string
数组构造char
对象。第二个需要标准转换,将指针转换为bool
(空指针变为false,非空指针变为true)。这里的规则是标准转换优于用户定义的转换(13.3.3.2 [over.ics.rank] / 2),因此编译器选择bool
版本。
答案 2 :(得分:1)
您可以删除所有运营商&lt;&lt;在你的班级并有一个模板:
template <typename T>
Log& operator << (Log& log, const T& value) {
// ...
return log;
}
答案 3 :(得分:1)
将&lt;&lt;(bool)替换为&lt;&lt;(OnlyBool),将OnlyBool定义为:
struct OnlyBool
{
OnlyBool(bool b) : m_b(b){}
bool m_b;
};
这个想法是使用从bool隐式创建的类型,但只使用bool。
(很抱歉,我正在手机上写这封信)