用于std :: cout的运算符<< C ++链接

可能重复:
当运算符<<重载时,std :: endl是未知类型
运算符超载

我目前正在编写一个记录器类,但operator<<方法会导致编译器错误。 这是一个最小化的类,在文件“logger.h”中:

#include <iostream>
class Logger {
public:
    Logger() : m_file(std::cout) {}

    template <typename T>
    Logger &operator<<(const T &a) {
        m_file<<a;
        return *this;
    }

protected:
    std::ostream& m_file;
};

它包含在我的main.cpp中,并且在输出字符串时完美地工作:

log << "hi"; 

但是,以下内容不能编译。

#include "logger.h"
int main() {
    Logger log;

    log << std::endl;
}

g ++编译器报告:

src / main.cpp:5:错误:'log << std :: endl'中'operator <<'不匹配


你的问题不是关于<<的链条,单个log << endl也会导致这个问题。 这是因为std::endl是一个模板函数:

template <class charT, class traits>
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);

basic_ostreamoperator<<的重载之一是:

template <class charT, class traits = char_traits<charT> >
class basic_ostream : virtual public basic_ios<charT,traits> {
public:
    basic_ostream<charT,traits>& operator<<(
    basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&));
//...
};

所以当使用std::cout<<std::endl时,可以推导出模板参数。 但是,当左边是class Logger ,编译无法推导出endl的模板参数。 显式给出模板参数可以让程序编译和工作:

#include <iostream>
class Logger
{
public:
    std::ostream &m_file;
    Logger(std::ostream &o = std::cout):m_file(o){};

    template <typename T>
    Logger &operator<<(const T &a) {
        m_file<<a;
        return *this;
    }
};

int main()
{
    Logger log;
    log<<std::endl<char, std::char_traits<char> >;
    log<<"hi"<<" stackoverflow"<<std::endl<char, std::char_traits<char> >;
    return 0;
}

或者,您可以在class Logger添加operator<<的新重载,以便编译器推断std::endl的模板参数:

#include <iostream>
class Logger
{
public:
    std::ostream &m_file;
    Logger(std::ostream &o = std::cout):m_file(o){};

    template <typename T>
    Logger &operator<<(const T &a) {
        m_file<<a;
        return *this;
    }

    Logger &operator<<(std::ostream& (*pf) (std::ostream&)){
        m_file<<pf;
        return *this;
    }
};

int main()
{
    Logger log;
    log<<std::endl;
    log<<"hi"<<" stackoverflow"<<std::endl;
    return 0;
}

此外,如果您不需要立即刷新输出,则可以使用' n'而不是endl


该错误是由std::endl这是一个函数引起的。 参考:

当运算符<<重载时,std :: endl是未知类型

链接地址: http://www.djcxy.com/p/12697.html

上一篇: C++ chaining of the operator << for std::cout like usage

下一篇: Return value of operator++