对类型 'A *' 的非常量左值引用无法绑定到不相关类型 'std::shared_ptr<A>' 的值
Non-const lvalue reference to type 'A *' cannot bind to a value of unrelated type 'std::shared_ptr<A>'
首先,有一堆类似的帖子,看起来像是完全相同的问题,但我发现它们与我的问题不同。我在 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>'
为什么会这样?
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) {}
首先,有一堆类似的帖子,看起来像是完全相同的问题,但我发现它们与我的问题不同。我在 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>'
为什么会这样?
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) {}