shared_ptr<> 如何作为参数传入函数
时间: 2024-05-02 08:17:30 浏览: 11
可以直接将 `shared_ptr<>` 对象作为参数传递给函数,如下所示:
```cpp
void myFunction(std::shared_ptr<MyClass> ptr) {
// 使用 ptr 指向的对象
// ...
}
int main() {
std::shared_ptr<MyClass> ptr(new MyClass());
myFunction(ptr);
// ...
return 0;
}
```
在函数中,可以像使用普通指针一样使用 `shared_ptr<>` 智能指针,因为智能指针重载了 `*` 和 `->` 运算符。当函数返回时,智能指针会自动管理指向的对象的生命周期,确保在所有持有该指针的地方,对象都会被正确释放。
相关问题
cannot bind non-const lvalue reference of type ‘std::shared_ptr<float>
这个错误通常出现在试图将一个非常数左值引用绑定到类型为 `std::shared_ptr<float>` 的参数上。`std::shared_ptr` 是一个智能指针类,它拥有对动态分配的对象的共享所有权。
在 C++ 中,非常数左值引用(即 `&`)需要绑定到一个可以修改的对象上。然而,`std::shared_ptr` 的拷贝构造函数和拷贝赋值运算符都要求传入的参数是一个常数引用。
为了解决这个问题,你可以将参数类型更改为 `const std::shared_ptr<float>&`,或者使用值传递而不是引用传递。具体取决于你的需求和设计。
例如,如果你有一个函数 `void foo(const std::shared_ptr<float>& ptr)`,你可以将 `std::shared_ptr<float>` 对象传递给它:
```cpp
std::shared_ptr<float> ptr = std::make_shared<float>(3.14);
foo(ptr);
```
或者,你可以通过值传递来避免错误:
```cpp
void foo(std::shared_ptr<float> ptr) {
// 在函数内部使用 ptr
}
std::shared_ptr<float> ptr = std::make_shared<float>(3.14);
foo(ptr);
```
希望对你有所帮助!如果还有其他问题,请随时提问。
/workspace/S2/qt/Deploy_infer/MySpdlog.h:35: error: could not convert 'myLogger1' from 'shared_ptr<spdlog::sinks::rotating_file_sink<std::mutex>>' to 'shared_ptr<spdlog::logger>' 35 | spdlog::set_default_logger(myLogger1); | ^~~~~~~~~ | | | shared_ptr<spdlog::sinks::rotating_file_sink<std::mutex>>
这个错误是因为 `spdlog::set_default_logger` 函数需要接受一个 `shared_ptr<spdlog::logger>` 类型的参数,而你传入了一个 `shared_ptr<spdlog::sinks::rotating_file_sink<std::mutex>>` 类型的参数。
这是因为 `spdlog::sinks::rotating_file_sink<std::mutex>` 是一个日志输出 sink 类型,而 `spdlog::logger` 是一个日志记录器类型。你需要在创建日志记录器时使用 `spdlog::logger` 类型,而不是 `spdlog::sinks::rotating_file_sink<std::mutex>` 类型。
你可以使用以下代码来创建一个日志记录器:
```cpp
auto myLogger1 = std::make_shared<spdlog::logger>("my_logger", std::make_shared<spdlog::sinks::rotating_file_sink_mt>("logs/log.txt", 1024 * 1024 * 5, 3));
```
这个代码会创建一个名为 "my_logger" 的日志记录器,它将日志输出到 `logs/log.txt` 文件中,日志文件大小限制为 5 MB,最多保留 3 个历史日志文件。然后,你可以将这个日志记录器设置为默认记录器:
```cpp
spdlog::set_default_logger(myLogger1);
```
这样就可以了。如果你有任何疑问,请随时问我。