在 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());
我想在 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());