-1

假设我有一个包含 A 类数组的 B 类,我想使用std::wostringstream输出 B 类中的数据。我已经为 B 类重载了运算符<<,但我只得到 'E0349' 和 'C2679'错误。

A类的定义

class A
{
public:
    A();
    ~A();
    inline A(float _x, float _y, float _z) :
        x(_x), y(_y), z(_z)
    {
    }
    inline void Set(float _x, float _y, float _z);

    float x, y, z;
    friend std::ostream& operator<<(std::ostream& out, const A& source);
    friend std::wostringstream& operator<<(std::wostringstream& out, const A& source);
private:

};

B类的定义

class B
{
public:
    A* ArrayOfA;
    bool Initialize(const A* samples,
        unsigned int count);
    friend std::wostringstream& operator<<(std::wostringstream& out, const B& source);

    B();
    ~B();

private:

};

如您所见,B 类有一个 A 类数组。我<<为 A 类重载了运算符。

std::wostringstream&
operator<<(std::wostringstream& out, const A& source)
{
    out << '<' << source.x << ',' << source.y << ',' << source.z << '>';

    return out;
}

现在,我想使用 B 类:

std::wostringstream wss;
wss << ClassB

但是我不能。

这是错误代码,我<<为 B 类重载了运算符

std::wostringstream&
operator<<(std::wostringstream& out, const B& source)
{

    for (unsigned int i = 0; i < 4; ++i)
    {
        out << ":" << source.ArrayOfA[i] << std::endl;
        // ERROR:E0349 no operator "<<" matches these operands
        // ERROR:C2679 binary '<<' : no operator found which takes a right-hand operand of type'A' (or there is no acceptable conversion)
    }

    return out;

}

这是完整的代码。它是在线编译器。

有点长的代码示例,但有细节

完整代码在 URL 中。

怎么了?您如何将ArrayOfA发送到std::wostringstream?如果你只使用std::ostream,你将如何获得像std::wostringstream这样的字符串内容?我的运算符重载有什么问题吗?

4

1 回答 1

2

请记住,std::wostringstream << char(or wchar_t) 返回的是 astd::wostream不是a std::wostringstream。所以,有效地,

out << '<' << source.ArrayOfA[i];

会寻找功能

std::wostream &operator<<( std::wostream &out, const A & );

你真正想要的是接受并返回一个std::wostream.

std::wostream&
operator<<(std::wostream& out, const A& source)
{
    out << '<' << source.x << ',' << source.y << ',' << source.z << '>';
    return out;
}

std::wostream&
operator<<(std::wostream& out, const B& source)
{
    for (unsigned int i = 0; i < 4; ++i)
    {
        out << L":" << source.ArrayOfA[i] << std::endl; 
    }
    return out;
}

std::wostream与 兼容std::wostringstream,所以这样的东西仍然可以工作:

std::wostringstream wss;
wss << ClassB
于 2020-07-09T15:50:39.233 回答