Objective-C+中类型错误的非常量左值引用+;使用类类型的参数时的包装器 我有两个包装类在 ObjuleC++中编写了它们的等价C++类。让我们称它们为OABCClass和OXYZCallbackInterface。现在我在C++(ABCClass)中有了一个方法,其中一个参数是接口-XYZCallbackInterface

Objective-C+中类型错误的非常量左值引用+;使用类类型的参数时的包装器 我有两个包装类在 ObjuleC++中编写了它们的等价C++类。让我们称它们为OABCClass和OXYZCallbackInterface。现在我在C++(ABCClass)中有了一个方法,其中一个参数是接口-XYZCallbackInterface,c++,objective-c,wrapper,objective-c++,C++,Objective C,Wrapper,Objective C++,例如: std::string methodWithArguments(std::string req, CommonNamespace::XYZCallbackInterface &callback); 我的ObjuleC++包装器类,即 OABCClass < /C> >我的方法实现上述C++方法看起来如下: -(NSString *)methodWithArguments(NSString*)req callback(OXYZCallbackInterface*)callbac

例如:

std::string methodWithArguments(std::string req, CommonNamespace::XYZCallbackInterface &callback);
<>我的ObjuleC++包装器类,即<代码> OABCClass < /C> >我的方法实现上述C++方法看起来如下:

-(NSString *)methodWithArguments(NSString*)req  callback(OXYZCallbackInterface*)callback {
    std::string res = cppClassVariable->methodWithArguments(req.UTF8String, callback);
}
这里我得到一个错误:

对“Common::XYZCallbackInterface”类型的非常量左值引用无法绑定到“Common::XYZCallbackInterface*”类型的临时

正确的使用方法是什么?感谢您的帮助。

  //Objective-C++ side
  #ifndef OXYZCallbackInterface_h
  #define OXYZCallbackInterface_h
  #import <Foundation/Foundation.h>

  //.h
  @interface OXYZCallbackInterface : NSObject

  -(bool)onResponseAvailable:(NSString* )response;

  @end
  #endif /* OXYZCallbackInterface_h */

  //.mm
  #import "OXYZCallbackInterface.h"
  #include "Common/Common.Shared/OXYZCallbackInterface.h"

  using namespace CommonNamespace;

  @implementation OXYZCallbackInterface

  - (instancetype)init
  {
   self = [super init];
     return self;
  }

  -(bool)onResponseAvailable:(NSString* )response{
     bool isResp = _objIPICCallback->onResponseAvailable(response.UTF8String);
    return isResp;
 }

  @end

  //C++ side
  #pragma once

  #include "DataTypes.h"

 namespace CommonNamespace
 {
 class XYZCallbackInterface
 {
 public:
    virtual ~ XYZCallbackInterface() {}
    virtual bool onResponseAvailable(std::string response) = 0;
 };
}

你不显示你的代码> OxZCalBealStuteI/<代码> ObjultC++类,所以很难确定它是如何包装的<>代码XYZCALBeutoSudio C++接口。但是,可以肯定的是,
OXYZCallbackInterface
不是
XYZCallbackInterface
(在面向对象的“is-a”意义上)。
OXYZCallbackInterface
的实例不是
XYZCallbackInterface
(或任何子类)的实例。因此,不能将指向
OXYZCallbackInterface
实例的指针传递给期望引用
XYZCallbackInterface
实例的函数

您的包装器必须提供一种方法来展开自身并返回指向其包装的原始
XYZCallbackInterface
对象的指针或引用。假设它有这个签名:

- (XYZCallbackInterface*) original;

然后,您可以调用C++方法,例如:

 std::string res = cppClassVariable->methodWithArguments(req.UTF8String, *[callback original]);

我既懂C++,又精通C语言,这个问题我完全无法理解。你是试图从目标C调用C++类(这很容易)还是反之亦然?如果是后者,则需要“打包”目标C对象,以提供一个C++ API。我尝试从目标的其他方式调用C++类,我尝试用CpCultValue:> Meod使用参数(Req.Uutf8Snter,(XYZCalBead接口)回调);请在问题中添加您想要调用的方法的声明(而不是作为注释)。然后是我。谢谢。请检查。@paulsanders关于
OXYZCallbackInterface
的实现情况如何?它以什么方式包装
XYZCallbackInterface
?感谢您的帮助。你在这方面比我做得好得多。还添加了实现。请查收@KenThomases@icodes,从您发布的内容来看,
OXYZCallbackInterface
在任何方面都不是
XYZCallbackInterface
的包装器。包装器意味着您有一个
XYZCallbackInterface
的实例,您创建了一个
OXYZCallbackInterface
的实例,该实例保存另一个对象(例如,在实例变量中),并将它接收到的消息转发给该对象。只需要创建这样的包装器,如果需要用C++对象来处理它,比如将其存储在<代码> NSArray <代码>或其他什么。如果你不需要,就用C++类本身来做。@ KeSimOase:如果你可以共享示例实现,那将是非常棒的。
 std::string res = cppClassVariable->methodWithArguments(req.UTF8String, *[callback original]);