gpt4 book ai didi

c++ - 为什么在重载的 ostream 运算符中引用 lambda 中的 vector 会导致错误?

转载 作者:搜寻专家 更新时间:2023-10-31 00:07:13 27 4
gpt4 key购买 nike

在我的矩阵实现中,我使用 vector 的 vector 作为私有(private)成员。我重载了 ostream 运算符,因此我可以打印矩阵中的所有值。在下面的代码中,我首先使用 for_each 遍历矩阵的“行”。在 lambda 中,我在这一行的末尾指定了一个参数(矩阵“列”)作为对 vector 的引用:

std::for_each(p_matrix.m_vector_of_vectors.begin(), p_matrix.m_vector_of_vectors.end(), [& p_out] (std::vector<int> & el)

这会导致错误。这是完整的代码:

#include <iostream>
#include <vector>
#include <algorithm>

class Matrix{
public:
Matrix()
{
m_vector_of_vectors = {{1,2,3},{4,5,6},{7,8,9}};
}
friend std::ostream & operator << (std::ostream & p_out, const Matrix & p_matrix)
{
std::for_each(p_matrix.m_vector_of_vectors.begin(), p_matrix.m_vector_of_vectors.end(), [& p_out] (std::vector<int> & el)
{
std::for_each(el.begin(), el.end(), [& p_out] (int & el2)
{
p_out << el2 << " ";
});
p_out << std::endl;
});
return p_out;
}
private:
std::vector<std::vector<int>> m_vector_of_vectors;
};

int main()
{
Matrix l_matrix;
std::cout << l_matrix;
return 0;
}

这是完整的错误打印:

In file included from /usr/include/c++/5/algorithm:62:0,
from main.cpp:11:
/usr/include/c++/5/bits/stl_algo.h:

In instantiation of ‘_Funct std::for_each(_IIter, _IIter, _Funct) [with _IIter = __gnu_cxx::__normal_iterator<const std::vector<int>*, std::vector<std::vector<int> > >; _Funct = operator<<(std::ostream&, Matrix)::<lambda(std::vector<int>&)>]’:
<span class="error_line" onclick="ide.gotoLine('main.cpp',29)">main.cpp:29:10</span>: required from here

/usr/include/c++/5/bits/stl_algo.h:3767:5: error: no match for call to ‘(operator<<(std::ostream&, Matrix)::&)>) (const std::vector&)’
__f(*__first);

main.cpp:22:129: note: candidate: operator<<(std::ostream&, Matrix)::&)>
std::for_each(p_matrix.m_vector_of_vectors.begin(), p_matrix.m_vector_of_vectors.end(), [& p_out] (std::vector<int> & el)

没有引用一切正常:

std::for_each(p_matrix.m_vector_of_vectors.begin(), p_matrix.m_vector_of_vectors.end(), [& p_out] (std::vector<int> el)

有人可以解释为什么这个单一的引用文献很重要吗?在第二个(内部)lambda 代码中使用和不使用引用。重载运算符中的 p_matrix 参数也是如此。我尝试循环遍历作为普通变量的 vector vector :

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
std::vector<std::vector<int>> a = {{1,2,3},{4,5,6},{7,8,9}};
std::for_each(a.begin(), a.end(), [] (std::vector<int> & el)
{
std::for_each(el.begin(), el.end(), [] (int & el2)
{
std::cout << el2;
});
});

return 0;
}

这工作正常,所以我假设这个错误与重载运算符有关。感谢您的帮助。

最佳答案

friend std::ostream & operator << (std::ostream & p_out, const Matrix & p_matrix)

p_matrixconst .这意味着 p_matrix.m_vector_of_vectorsconst这意味着 p_matrix.m_vector_of_vectors.begin()返回 const_iterator这意味着传递给 lambda 的元素是 const .由于您的 lambda 采用了不兼容的非 const 引用。它会去掉 const元素,这是不允许的。更改 lambda 以采用 const 引用,例如

friend std::ostream & operator << (std::ostream & p_out, const Matrix & p_matrix)
{
std::for_each(p_matrix.m_vector_of_vectors.begin(), p_matrix.m_vector_of_vectors.end(), [& p_out] (std::vector<int> const & el) // <- const here
{
std::for_each(el.begin(), el.end(), [& p_out] (int const & el2) //<- const here
{
p_out << el2 << " ";
});
p_out << std::endl;
});
return p_out;
}

代码将会编译。在你的第二个例子中你不需要这个因为 a不是 const所以它的迭代器不是 const这意味着它传递给 lambda 的元素不是 const .

我还想指出,基于范围的 for 循环会使代码更加简洁。您可以更改您的 operator <<

friend std::ostream & operator << (std::ostream & p_out, const Matrix & p_matrix)
{
for (auto const& row : p_matrix.m_vector_of_vectors)
{
for (auto const& e : row)
p_out << e << " ";
p_out << "\n";
}
return p_out;
}

关于c++ - 为什么在重载的 ostream 运算符中引用 lambda 中的 vector 会导致错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54595722/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com