运算符<<奇怪的行为

时间:2013-12-04 13:51:58

标签: c++ stream

我有一个名为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 ......但是我该如何解决它?

4 个答案:

答案 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。

(很抱歉,我正在手机上写这封信)