C++ 对于ofstream,但对于ostream,警告不明确。什么';有什么区别?

C++ 对于ofstream,但对于ostream,警告不明确。什么';有什么区别?,c++,compiler-warnings,C++,Compiler Warnings,这并不重要。但我很好奇这个警告何时出现。我真正的问题是为什么ostream和ofstream受到不同的对待 struct Test { int y; Test(int k) : y(k) {} }; 通过这个简单的结构,编译器可以将int转换为测试 因此,我得到一个警告,代码如下: std :: ofstream& operator<< (std :: ofstream& os, const Test& t) { os <&l

这并不重要。但我很好奇这个警告何时出现。我真正的问题是为什么ostream和ofstream受到不同的对待

struct Test {
    int y;
    Test(int k) : y(k) {}
};
通过这个简单的结构,编译器可以将
int
转换为
测试

因此,我得到一个警告,代码如下:

std :: ofstream& operator<<  (std :: ofstream& os, const Test& t)
{
    os << t.y;
    return os;
}

std::ofstream&operator正如警告告诉您的,对于
ofstream
两种解释都需要转换:

  • 调用时,在
    os的
    static_-cast(os)测试中执行流的
    &->ostream&

    os << t.y;
    

    os我花了大约10秒的时间才发现示例1和示例3之间的差异(
    *o*stream
    vs
    *of*stream
    ),这很有意义。但考虑到ofstream继承自ostream,您可能会认为这样的转换将更加自然。ofstream继承
    运算符
    
    os << t.y;
    
    ostream& operator << (ostream&, int) //1
    
    ofstream& operator << (ofstream&, Test) //2
    
    ofstream& operator << (ofstream&, int) //3