在 C++ Builder 中使用 NULL 构造 DynamicArray

Constructing DynamicArray with NULL in C++ Builder

我想在 C++Builder 中使用 DelphiOSCUtils 库。

问题可能是它使用了泛型,而 C++Builder 不能很好地处理泛型。

库中的代码如下:

USES ..., System.Generics.Collections; 

TOSCMessage = class(TOSCPacket)
private
  ...
public
  constructor Create(Address: string); overload;
  constructor Create(Bytes: TBytes); overload;

  TOSCPacket = class (TObject)
  private
   ...
  public
    constructor Create(Bytes: TBytes);
  end;

生成的 HPP 文件是:

class PASCALIMPLEMENTATION TOSCBundle : public TOSCPacket
{
    typedef TOSCPacket inherited;
private:
   ...
public:
    __fastcall TOSCBundle(System::DynamicArray<System::Byte> Bytes);
    __fastcall virtual ~TOSCBundle(void);
    __classmethod virtual TOSCPacket* __fastcall Unpack(System::DynamicArray<System::Byte> Bytes, int PacketOffset, int Count, System::Extended TimeTag = 0.000000E+00)/* overload */;
    /* Hoisted overloads: */    
public:
};

当我尝试在 C++ 中创建新的 TOSCMessage 对象时

TOSCBundle *bundle = new TOSCBundle(NULL);

我收到一个错误:

E2285 Could not find a match for 'TOSCBundle::TOSCBundle(int)'

有人对如何解决这个问题有一些指示吗?

您的问题与泛型无关。

在 C++ 中,NULL(通常)定义为整数常量 0 的别名。但是 TOSCBundle 没有接受 int 作为输入的构造函数。这就是编译器在你的情况下抱怨的。

您尝试调用的 TOSCBundle 构造函数采用 System::DynamicArray<System::Byte> 对象 ,因此您必须将实际的 DynamicArray<Byte> 传递给它] 要从中复制的对象。但是,与 Delphi 不同,您可以从 nil 初始化动态数组,在 C++ 中,您不能从 NULL (甚至 nullptr 在 C++11 及更高版本中)。 DynamicArray 没有相应的构造函数。

因此,要传递一个空数组,您必须传递一个默认构造的 DynamicArray 对象。在这种情况下,一个临时对象就足够了,例如:

TOSCBundle *bundle = new TOSCBundle(DynamicArray<Byte>());

或者,您可以使用 System::Sysutils::TBytes 别名(这是您显示的 Delphi 代码所使用的别名):

#include <System.SysUtils.hpp>

TOSCBundle *bundle = new TOSCBundle(TBytes());