Неконстантная lvalue ссылка на тип 'A *' не может привязаться к значению несвязанного типа 'std :: shared_ptr <A>' - PullRequest
2 голосов
/ 13 мая 2019

Прежде всего, есть куча похожих постов, которые выглядят так же, как и они, но я считаю, что они отличаются от моей проблемы. Я пытаюсь использовать умные указатели впервые в моей жизни C ++. У меня проблемы с умным указателем Чтобы быть точным, я пытаюсь преобразовать следующие необработанные указатели (строка № 15 кода, показанного ниже) в умные указатели:

class Maze {
 public:
  Maze() = default;
  ~Maze() = default;
  void BuildStack(MobileRobot *&robot_in_maze);
};

class Target {
 public:
  Target() = default;
  ~Target() = default;
  void GoWheeled();
 private:
  Maze wheeledMaze;
  MobileRobot *wheeledRobotInMaze = new WheeledRobot();
};

class MobileRobot {
 public:
  MobileRobot() = default;
  MobileRobot(std::string RobotName);
  ~MobileRobot() = default;
  std::string name;
};

class WheeledRobot : public MobileRobot {
 public:
  WheeledRobot(): MobileRobot("Wheeled Robot") {};
  ~WheeledRobot() = default;
};

class TrackedRobot : public MobileRobot {
 public:
  TrackedRobot(): MobileRobot("Tracked Robot") {};
  ~TrackedRobot() = default;
};

void Maze::BuildStack(MobileRobot *&robot_in_maze) {}

void Target::GoWheeled() {
     wheeledMaze.BuildStack(wheeledRobotInMaze);
}

Когда я пытаюсь преобразовать строку № 15 кода в тип общего указателя, показанный ниже:

std::shared_ptr<MobileRobot> wheeledRobotInMaze = std::make_shared<WheeledRobot>();

В строке № 41 кода появляется следующая ошибка:

Non-const lvalue reference to type 'MobileRobot *' cannot bind to a value of unrelated type 'std::shared_ptr<MobileRobot>'

Почему это происходит?

1 Ответ

2 голосов
/ 13 мая 2019

std::shared_ptr<X> неявно преобразуется в X*. Так как BuildStack ожидает необработанный указатель, он жалуется, когда вы пытаетесь вызвать его с shared_ptr. Вы можете просто получить необработанный указатель из shared_ptr:

void Target::GoWheeled() {
     // this variable is only needed because BuildStack takes an lvalue reference
     // if you can change that, you don't need the variable
     MobileRobot* rawPtr = wheeledRobotInMaze.get();
     wheeledMaze.BuildStack(rawPtr);
}

Или, возможно, лучший вариант, поскольку обычно лучше использовать shared_ptr вместо того, чтобы смешивать его с необработанными указателями, вы можете изменить сигнатуру BuildStack, чтобы взять shared_ptr:

void Maze::BuildStack(std::shared_ptr<MobileRobot> &robot_in_maze) {}
...