using RecvPkgptr = std::shared_ptr<void&SIMSSERVER::taskrecv ( const sockaddr_in& )>; 如何正确书写
时间: 2023-07-29 11:09:15 浏览: 43
这段代码已经是正确的,不需要进行修改。 你可以直接使用该类型别名 RecvPkgptr 来声明变量,如下所示:
```
RecvPkgptr ptr = std::make_shared<void&SIMSSERVER::taskrecv>(sockaddr_in());
```
该语句会创建一个 shared_ptr,指向一个 taskrecv 函数的实例,该实例接受一个 sockaddr_in 类型的参数。这里为了演示,将 sockaddr_in 初始化为默认值。
相关问题
std::shared_ptr<MessageT> 转换成std::shared_ptr<其他类型>
要将`std::shared_ptr<MessageT>`转换为`std::shared_ptr`的其他类型,您可以使用`std::static_pointer_cast`或`std::dynamic_pointer_cast`。这些函数都是C++标准库提供的类型转换函数,用于处理智能指针之间的转换。
- `std::static_pointer_cast`用于静态转换,即在编译时确定转换的类型。它会将`std::shared_ptr<MessageT>`转换为`std::shared_ptr<其他类型>`,前提是`其他类型`是`MessageT`的基类或派生类。
示例代码如下:
```cpp
std::shared_ptr<MessageT> ptr1 = std::make_shared<MessageT>();
std::shared_ptr<其他类型> ptr2 = std::static_pointer_cast<其他类型>(ptr1);
```
- `std::dynamic_pointer_cast`用于动态转换,即在运行时确定转换的类型。它会将`std::shared_ptr<MessageT>`转换为`std::shared_ptr<其他类型>`,前提是`其他类型`是`MessageT`的基类或派生类,并且运行时指针的实际类型与目标类型相兼容。
示例代码如下:
```cpp
std::shared_ptr<MessageT> ptr1 = std::make_shared<MessageT>();
std::shared_ptr<其他类型> ptr2 = std::dynamic_pointer_cast<其他类型>(ptr1);
if (ptr2 != nullptr) {
// 转换成功
// ...
} else {
// 转换失败
// ...
}
```
请注意,这些转换只适用于具有继承关系的类型之间的转换。如果您要执行不相关类型之间的转换,那么这些转换函数是不适用的。
没有与这些操作数匹配的 "=" 运算符C/C++(349) listener_str.cpp(12, 23): 操作数类型为: std::shared_ptr<rclcpp::Subscription<std_msgs::msg::String, std::allocator<void>, rclcpp::message_memory_strategy::MessageMemoryStrategy<std_msgs::msg::String, std::allocator<void>>>> = std::shared_ptr<rclcpp::Subscription<const std::shared_ptr<std_msgs::msg::String_<std::allocator<void>>> &, std::allocator<void>, rclcpp::message_memory_strategy::MessageMemoryStrategy<const std::shared_ptr<std_msgs::msg::String_<std::allocator<void>>> &, std::allocator<void>>>>
这个错误通常是因为尝试将一个类型为`std::shared_ptr<rclcpp::Subscription<const std::shared_ptr<std_msgs::msg::String_<std::allocator<void>>> &, std::allocator<void>, rclcpp::message_memory_strategy::MessageMemoryStrategy<const std::shared_ptr<std_msgs::msg::String_<std::allocator<void>>> &, std::allocator<void>>>>`的变量赋值给一个类型为`std::shared_ptr<rclcpp::Subscription<std_msgs::msg::String, std::allocator<void>, rclcpp::message_memory_strategy::MessageMemoryStrategy<std_msgs::msg::String, std::allocator<void>>>>`的变量,这两个类型虽然都是指向`rclcpp::Subscription`的`shared_ptr`,但是模板参数不同,无法直接赋值。
解决方法是将两个类型匹配,可以通过使用`std::static_pointer_cast`将其中一个类型转换成另一个类型,例如:
```
std::shared_ptr<rclcpp::Subscription<std_msgs::msg::String, std::allocator<void>, rclcpp::message_memory_strategy::MessageMemoryStrategy<std_msgs::msg::String, std::allocator<void>>>> sub;
std::shared_ptr<rclcpp::Subscription<const std::shared_ptr<std_msgs::msg::String_<std::allocator<void>>> &, std::allocator<void>, rclcpp::message_memory_strategy::MessageMemoryStrategy<const std::shared_ptr<std_msgs::msg::String_<std::allocator<void>>> &, std::allocator<void>>>> sub_const;
// 将 sub_const 转换成 sub 的类型
sub = std::static_pointer_cast<rclcpp::Subscription<std_msgs::msg::String, std::allocator<void>, rclcpp::message_memory_strategy::MessageMemoryStrategy<std_msgs::msg::String, std::allocator<void>>>>(sub_const);
```