我正在开发一个使用流在客户端之间发送数据的项目。它实现了一堆流操作符来支持它。它在C++ Builder 2010
中运行良好,但现在我将项目移动到C++ Builder 10 Seattle
我得到了一个奇怪的错误。
在一个函数中创建TStream
并将数据写入其中
*pStream >>
Version >>
m_iPortNumber >>
m_iHeartBeatTimeout >>
m_iMaxToRead >>
m_pIPAddressFilter >>
m_iRetries;
m_pIPAddressFilter
这里是TStringList
,错误与此有关。它读取
[bcc32错误] E2015'>>(System :: Classes :: TStream)之间的歧义 &,bool&)在Common \ Streams.h:28'和'>>(System :: Classes :: TStream &,System :: Classes :: TStrings *)在Common \ Streams.h:42'
它所引用的实现流操作符看起来像这样
PACKAGE TStream & operator <<(TStream &Stream, bool b)
{
Stream.WriteBuffer(&b, sizeof(b));
return Stream;
}
PACKAGE TStream & operator >>(TStream &Stream, bool &b)
{
Stream.ReadBuffer(&b, sizeof(b));
return Stream;
}
PACKAGE TStream & operator <<(TStream &Stream, TStrings *pList)
{
int Count;
int i;
Stream << (Count=pList->Count);
for (i=0; i<Count; i++)
Stream << static_cast<WideString> (pList->Strings[i]);
return Stream;
}
PACKAGE TStream & operator >>(TStream &Stream, TStrings *pList)
{
AnsiString s;
int Count;
pList->Clear();
Stream >> Count;
while (Count--)
{
Stream >> s;
pList->Add(s);
}
return Stream;
}
如果使用bool
版本或采用TStrings
版本,编译器如何对此感到困惑并认为它是不明确的。 TStrings
甚至是TStringList
的父类,也就是写入流的内容。如上所述,这在C++ Builder 2010
中运行良好。
答案 0 :(得分:0)
您没有专门为>>
定义的TStringList*
运算符,因此编译器必须查找匹配的候选项以将TStringList*
指针转换为。任何指针都可以隐式转换为bool
,看起来编译器认为编译器创建的临时bool
变量是一个可行的重载候选者,因此TStringList*
可以转换为模糊性TStrings*
和bool&
(通过临时)。
更改TStrings*
运算符以取代TStrings&
参数(无论如何应该执行此操作,不要将对象指针传递给流操作符),然后将m_pIPAddressFilter
更改为{调用运算符时{1}}。然后就不会有任何歧义。
*m_pIPAddressFilter
另外,您的*pStream >>
...
*m_pIPAddressFilter
...;
运营商似乎不一致。 TStrings
使用中间<<
流出UnicodeString
个值(为什么?为什么使用WideString
?)。您的static_cast
运营商使用中间>>
来汇总UnicodeString
个值。这些是不同的数据转换,因此当存在非ASCII字符时,您可能会损坏数据。您需要为两个运算符使用一致的字符串类型。您应该使用AnsiString
变量按原样流式传输TStrings
值,然后使用一致的格式(如UTF-8)实现String
运算符来处理实际的流式传输,例如:
String