0

我正在开发一个使用流在客户端之间发送数据的项目。它实现了一堆流操作符来支持这一点。它运行良好,C++ Builder 2010但现在我将项目移动到C++ Builder 10 Seattle我得到一个奇怪的错误。

在一个函数TStream中创建 a 并将数据写入其中

*pStream >>
        Version >>
        m_iPortNumber >>
        m_iHeartBeatTimeout >>
        m_iMaxToRead >>
        m_pIPAddressFilter >>
        m_iRetries;

m_pIPAddressFilter这是一个TStringList,错误与此有关。它读到

[bcc32 错误] E2015 在 Common\Streams.h:28 处的 '>>(System::Classes::TStream &,bool &) 和 '>>(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;
}

编译器怎么会被这个弄糊涂,觉得应该用取abool还是取版本是模棱两可的TStrings。甚至是正在写入流TStrings的父类。TStringList如前所述,这在C++ Builder 2010.

4

1 回答 1

0

您没有>>专门为 定义的运算符TStringList*,因此编译器必须寻找匹配的候选对象以将TStringList*指针转换为。任何指针都可以隐式转换为 a bool,并且编译器似乎认为编译器创建的临时bool变量是可行的重载候选者,因此存在歧义,因为TStringList*可以同时转换为TStrings*and bool&(通过临时)。

将您的运算符更改TStrings*为采用TStrings&参数(无论如何您都应该这样做,不要将对象指针传递给流式运算符),然后在调用运算符时更改m_pIPAddressFilter为。*m_pIPAddressFilter那么就不会有歧义了。

*pStream >>
    ...
    *m_pIPAddressFilter
    ...;

另外,您的TStrings运营商似乎不一致。 正在使用中间<<流输出值(为什么?为什么要使用?)。您的运营商正在使用中间值流式传输值。这些是不同的数据转换,因此当存在非 ASCII 字符时,您可能会损坏数据。您需要为两个运算符使用一致的字符串类型。您应该使用变量按原样流式传输值,然后实现运算符以使用一致的格式(如 UTF-8)处理实际流式传输,例如:UnicodeStringWideStringstatic_cast>>UnicodeStringAnsiStringTStringsStringString

PACKAGE TStream & operator <<(TStream &Stream, String s)
{
    UTF8String utf = s;
    int Count = utf.Length();
    Stream << Count;
    Stream.WriteBuffer(utf.c_str(), Count);
    return Stream;
}

PACKAGE TStream & operator >>(TStream &Stream, String &s)
{
    UTF8String utf;
    int Count;
    Stream >> Count;
    s.SetLength(Count);
    Stream.ReadBuffer(utf.c_str(), Count);
    s = utf;
    return Stream;
}

PACKAGE TStream & operator <<(TStream &Stream, TStrings &pList)
{
    int Count = pList.Count;
    Stream << Count;
    for (int i = 0; i < Count; ++i)
        Stream << pList.Strings[i];
    return Stream;
}

PACKAGE TStream & operator >>(TStream &Stream, TStrings &pList)
{
    pList.BeginUpdate();
    try
    {
        pList.Clear();

        String s;
        int Count;

        Stream >> Count;
        while (Count--)
        {
            Stream >> s;
            pList.Add(s);
        }
    }
    __finally {
        pList.EndUpdate();
    }

    return Stream;
}
于 2015-09-25T21:59:36.433 回答