自定义模板化运算符 <<(T x) 上的错误 C2676

Error C2676 on custom templated operator<<(T x)

我有 logger class 封装了 2 std::ofstream:

class logger
{           
  private:
    std::ofstream one;
    std::ofstream two;

  public:
    logger();
    ~logger();

    template<typename T> logger & operator<<(T);
};

logger::logger()
{
  // open streams
}

logger::logger()
{
  // close streams
}

template<typename T> logger & logger::operator<<(T log)
{
    this->one<<log;
    this->two<<log;
    return * this;
}

我用它:

int main(int argc, char * argv[])
{
  debug::log << "Some strgins"; // works perfect.
  debug::log << std::endl; //  error C2676: binary '<<' : 'logger' does not define this operator or a conversion to a type acceptable to the predefined operator
  return 0;
}

这里发生了什么?为什么T不能变成std::ostream&(*)(std::ostream&)

std::endl 是一个 函数模板 。这是一个IO 操纵器。

有一个 std::endl<char>std::endl<wchar_t> 和无数个其他 std::endl,每种可能的字符类型一个。编译器不知道你可能指的是哪一个。

它与 std::basic_ostream 一起工作,因为 std::basic_ostream 重载 operator<< 以接受适合 its 字符类型的 IO 操纵器。请记住 std::basic_ostream 也是一个模板,而 std::ostream 只是 basic_ostream<char>.

的类型定义

您可能也想为您的 class 添加一个,只是为了 char

logger & logger::operator<<(std::ostream& (manip)(std::ostream&)) { ... }

编译器会知道您指的是哪个 endl:采用 char 流的那个。