conversion from ‘main()::<lambda()>’ to non-scalar type ‘CallBack<void (*)()>’ requested
时间: 2024-04-21 18:26:43 浏览: 18
这个错误通常是因为尝试将一个Lambda表达式转换为一个非标量类型。Lambda表达式是一个匿名函数对象,而非标量类型是指那些不能被简单地赋值或比较的类型。在这种情况下,您可能正在尝试将一个Lambda表达式分配给一个函数回调对象,但是回调对象不支持Lambda表达式。可能需要将Lambda表达式转换为函数指针或使用支持Lambda表达式的回调对象。
相关问题
[Error] conversion from 'std::vector<int>::const_iterator {aka __gnu_cxx::__normal_iterator<const int*, std::vector<int> >}' to non-scalar type 'std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}' requested
这个错误通常是因为你试图将一个 `const` 迭代器(`const_iterator`)转换为非 `const` 迭代器(`iterator`)。在 C++ 中,`const` 迭代器不能用于修改其指向的元素,而非 `const` 迭代器可以进行修改。因此,编译器会阻止这种转换,以避免不合法的修改。
解决这个问题的方法取决于你的具体情况。如果你确实需要修改迭代器指向的元素,那么你需要使用非 `const` 迭代器。如果你不需要修改元素,那么将迭代器声明为 `const_iterator` 就可以了。
以下是一个示例代码,演示了如何使用 `const_iterator` 和 `iterator`:
```cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> v {1, 2, 3, 4, 5};
// 使用 const_iterator 遍历 vector
for (std::vector<int>::const_iterator it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// 使用 iterator 修改 vector 中的元素
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
*it = *it * 2;
}
// 再次使用 const_iterator 遍历 vector
for (std::vector<int>::const_iterator it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
```
输出结果为:
```
1 2 3 4 5
2 4 6 8 10
```
error: conversion from ‘std::vector<cv::Mat>’ to non-scalar type ‘cv::Mat’ requested
这个错误提示表明你尝试将一个 std::vector<cv::Mat> 类型的变量转换成 cv::Mat 类型,但是这种转换是不被允许的。
通常来说,这种错误是因为你在使用 OpenCV 库中的某个函数时,函数的返回值是 std::vector<cv::Mat> 类型,而你在调用该函数时尝试将返回值转换成 cv::Mat 类型。
解决这个问题的方法是,要么修改你的代码,使其能够正确地处理 std::vector<cv::Mat> 类型的变量;要么查看 OpenCV 文档,了解该函数的正确用法和返回值类型,以便正确地处理返回值。