在 C++ 中如何将 class 的数据写入 wostringstream?
How do you write your class's data to wostringstream in C++?
假设我有一个 class B,其中包含一个 class A 的数组,我想使用 std::wostringstream 来输出数据在 class B 中。我为 Class B 重载了运算符 <<
,但我只得到 'E0349' 和 'C2679' 错误。
classA
的定义
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:
};
classB
的定义
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:
};
如您所见,class B 有一个 class A 的数组。
我为 class A.
重载了运算符 <<
std::wostringstream&
operator<<(std::wostringstream& out, const A& source)
{
out << '<' << source.x << ',' << source.y << ',' << source.z << '>';
return out;
}
现在,我想像这样使用 Class B:
std::wostringstream wss;
wss << ClassB
但是我做不到。
这是错误代码,我为 Class 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;
}
这是完整的代码。是在线编译器。
A little bit of long code sample, but with details
完整代码在 URL.
怎么了?你如何将 ArrayOfA 发送到 std::wostringstream?如果你只用std::ostream,你怎么得到像std::wostringstream这样的字符串内容呢?我的运算符重载有什么问题吗?
请记住 std::wostringstream << char
(或 wchar_t
)return是 std::wostream
而 不是 std::wostringstream
.所以,实际上,
out << '<' << source.ArrayOfA[i];
会寻找函数
std::wostream &operator<<( std::wostream &out, const A & );
你真正想要的是吸收,return 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
假设我有一个 class B,其中包含一个 class A 的数组,我想使用 std::wostringstream 来输出数据在 class B 中。我为 Class B 重载了运算符 <<
,但我只得到 'E0349' 和 'C2679' 错误。
classA
的定义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:
};
classB
的定义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:
};
如您所见,class B 有一个 class A 的数组。 我为 class A.
重载了运算符<<
std::wostringstream&
operator<<(std::wostringstream& out, const A& source)
{
out << '<' << source.x << ',' << source.y << ',' << source.z << '>';
return out;
}
现在,我想像这样使用 Class B:
std::wostringstream wss;
wss << ClassB
但是我做不到。
这是错误代码,我为 Class 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;
}
这是完整的代码。是在线编译器。
A little bit of long code sample, but with details
完整代码在 URL.
怎么了?你如何将 ArrayOfA 发送到 std::wostringstream?如果你只用std::ostream,你怎么得到像std::wostringstream这样的字符串内容呢?我的运算符重载有什么问题吗?
请记住 std::wostringstream << char
(或 wchar_t
)return是 std::wostream
而 不是 std::wostringstream
.所以,实际上,
out << '<' << source.ArrayOfA[i];
会寻找函数
std::wostream &operator<<( std::wostream &out, const A & );
你真正想要的是吸收,return 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