error: cannot bind non-const lvalue reference of type ‘std::__cxx11::string& {aka std::__cxx11::basic_string<char>&}’ to an rvalue of type ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ identify.init("best.engine");
时间: 2023-08-08 12:14:17 浏览: 305
这个错误提示是说你在调用函数 `identify.init("best.engine")` 时,函数参数类型不匹配。具体来说,函数 `init` 的参数类型是非常量左值引用 `std::string&`,而你传递的是一个右值 `std::string`(即 `"best.engine"`),这就无法匹配了。
解决这个问题的方法有两种:
1. 将函数 `init` 的参数类型改为常量引用 `const std::string&`。这样就可以接受右值参数了。修改后的函数声明应该是这样的:`void init(const std::string& arg)`。
2. 将 `"best.engine"` 转换为左值。可以通过将其定义为 `std::string` 对象来实现,例如:`std::string engine = "best.engine"; identify.init(engine);`。
选择哪种方法取决于你的具体情况。如果你需要在函数内部修改传递的字符串,那么第一种方法可能不太合适,应该选择第二种方法。如果你只需要读取传递的字符串,那么第一种方法更为简单和高效。
相关问题
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);
```
希望对你有所帮助!如果还有其他问题,请随时提问。
cannot bind non-const lvalue reference of type ‘std::shared_ptr<float>&’ to an rvalue of type ‘std::shared_ptr<float>’
这个错误是因为你尝试将一个右值(`rvalue`)绑定到一个非常量左值引用上。在你的代码中,`std::shared_ptr<float> features` 是一个非常量左值引用,而 `new float[FR->GetExtractFeatureSize()]` 返回的是一个右值。
为了解决这个问题,你可以将 `features` 声明为一个右值引用或者使用 `std::move` 将右值转换为左值。以下是两种可能的解决方法:
方法一:将 `features` 声明为一个右值引用
```cpp
std::shared_ptr<float>&& features(new float[FR->GetExtractFeatureSize()], std::default_delete<float[]>());
```
方法二:使用 `std::move` 将右值转换为左值
```cpp
std::shared_ptr<float> features(std::move(std::shared_ptr<float>(new float[FR->GetExtractFeatureSize()], std::default_delete<float[]>())));
```
请注意,在使用 `std::move` 进行转换之后,原始的右值 `std::shared_ptr` 对象将不再拥有所管理的资源。因此,在转移所有权之前,请确保不再需要原始的 `std::shared_ptr` 对象。
希望这些解决方案能够帮助你解决问题。如果还有其他疑问,请随时提问。
阅读全文