как вы записываете данные вашего класса в wostringstream на c ++ - PullRequest
0 голосов
/ 09 июля 2020

Скажем, у меня есть класс B, который включает массив класса A, я хочу использовать std :: wostringstream для вывода данных в классе BI, перегрузили оператор << для класса B, но я просто получите ошибку 'E0349' и 'C2679'. </p>

Определение класса 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 </p>

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 </p>

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 ? Что-то не так с моей перегрузкой оператора? Большое спасибо за чью-то помощь!

1 Ответ

2 голосов
/ 09 июля 2020

Имейте в виду, что std::wostringstream << char (или wchar_t) возвращает std::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
...