Неконстантная lvalue ссылка на тип - Ошибка в оболочке Objective-C ++ при использовании параметра типа Class - PullRequest
0 голосов
/ 01 июня 2018

У меня есть два класса-обёртки, написанные на Objective-C++ для их эквивалентных классов C ++.Давайте назовем их OABCClass и OXYZCallbackInterface.Теперь у меня есть метод в C++ (ABCClass), в котором аргумент имеет интерфейс- XYZCallbackInterface.

Например:

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

В моем классе оболочки Objective-C ++ для ie OABCClass моя реализация метода для вышеупомянутого метода C ++ выглядит следующим образом:

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

Здесь я получаю ошибку:

Неконстантная lvalue ссылка на тип '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;
 };
}

И реализация 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;
}

1 Ответ

0 голосов
/ 02 июня 2018

Вы не показываете свой класс 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]);
...