对类型的非const左值引用 – 使用Class类型的参数时,Objective-C包装器中的错误

我有两个用Objective-C编写的包装类,用于它们的等效C类.我们称它们为OABCClass和OXYZCallbackInterface.现在我在C(ABCClass)中有一个方法,其中一个参数是一个接口-XYZCallbackInterface.

例如 :

std::string methodWithArguments(std::string req, CommonNamespace::XYZCallbackInterface &callback);

在我的Objective-C包装类中,即OABCClass,我上面提到的C方法的方法实现如下:

-(NSString *)methodWithArguments(NSString*)req  callback(OXYZCallbackInterface*)callback {
    std::string res = cppClassVariable->methodWithArguments(req.UTF8String, callback);
}

我在这里得到错误:

Non-const lvalue reference to type ‘Common::XYZCallbackInterface’ cannot bind to a temporary of type ‘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;
 };
}

OABCClass.mm实现如下:

-(NSString*) methodWithArguments(NSString*)req  callback(OXYZCallbackInterface*)callback{
   NSString* result = @"";

   _pOABC -> methodWithArguments("", (__bridge XYZCallbackInterface*)callback);

   //  Error : Non-const lvalue reference to type CommonNamespace::XYZCallbackInterface cannot bind to a temporary of type CommonNamespace::XYZCallbackInterface *

   return result;
}

最佳答案 您没有显示您的OXYZCallbackInterface Objective-C类,因此很难确定它是如何“包装”XYZCallbackInterface C接口的.但是,OXYZCallbackInterface不是XYZCallbackInterface(在面向对象的“is-a”意义上)是肯定的. OXYZCallbackInterface的实例不是XYZCallbackInterface(或任何子类)的实例.因此,您不能将指向OXYZCallbackInterface实例的指针传递给期望引用XYZCallbackInterface实例的函数.

你的包装器必须提供一种解包方法,并返回指向它包装的原始XYZCallbackInterface对象的指针或引用.让我们说它有这个签名:

- (XYZCallbackInterface*) original;

然后,您可以这样调用C方法:

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