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



我想在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 obj 时

TOSCBundle *bundle = new TOSCBundle(NULL);

我收到一个错误:

E2285 找不到 'TOSCBundle::TOSCBundle(int(' 的匹配项

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

您的问题与泛型无关。

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

您尝试调用的TOSCBundle构造函数按值获取System::DynamicArray<System::Byte>对象,因此您必须向其传递要从中复制的实际DynamicArray<Byte>对象。 但是,与 Delphi 中您可以从nil初始化动态数组不同,在 C++ 中,您无法从NULL(甚至从 C++11 及更高版本中的nullptr(构造DynamicArrayDynamicArray没有构造函数。

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

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

或者,您可以使用System::Sysutils::TBytes别名(无论如何,您显示的 Delphi 代码都在使用(:

#include <System.SysUtils.hpp>
TOSCBundle *bundle = new TOSCBundle(TBytes());

相关内容

  • 没有找到相关文章

最新更新