我想在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
(构造DynamicArray
。DynamicArray
没有构造函数。
因此,要传入空数组,您必须传入默认构造的DynamicArray
对象。 在这种情况下,一个临时对象就足够了,例如:
TOSCBundle *bundle = new TOSCBundle(DynamicArray<Byte>());
或者,您可以使用System::Sysutils::TBytes
别名(无论如何,您显示的 Delphi 代码都在使用(:
#include <System.SysUtils.hpp>
TOSCBundle *bundle = new TOSCBundle(TBytes());