将TStringList写入TStream时的歧义

时间:2015-09-24 18:32:50

标签: c++ c++builder tstringlist tstream c++builder-10-seattle

我正在开发一个使用流在客户端之间发送数据的项目。它实现了一堆流操作符来支持它。它在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中运行良好。

1 个答案:

答案 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