提问人:Vernon Gutierrez 提问时间:12/14/2021 更新时间:12/14/2021 访问量:271
std::inner_product 不使用特定的 std::vector + 和 * 运算符重载进行编译
std::inner_product doesn't compile with specific std::vector + and * operator overloads
问:
我正在尝试用 C++ 编写一个小型线性代数库,纯粹用于教育目的。我选择尽可能多地使用标准库来最大限度地提高我的学习效果。我正在尝试使用 .(矩阵按列优先顺序排列)。std::inner_product
我有以下代码,它不能在最新版本的 GCC(撰写本文时为 11.1.0)中编译:
#include <algorithm>
#include <functional>
#include <numeric>
#include <vector>
using namespace std;
// copy-pasted from <numeric>, but changed identifier
template<typename _InputIterator1, typename _InputIterator2, typename _Tp>
inline _Tp
inner_product2(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _Tp __init)
{
// concept requirements
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
__glibcxx_requires_valid_range(__first1, __last1);
for (; __first1 != __last1; ++__first1, (void)++__first2)
__init = __init + (*__first1 * *__first2);
return __init;
}
struct custom_int {
int x;
custom_int(): x(0) {}
custom_int(int x): x(x) {}
custom_int& operator+=(const custom_int& y) { x += y.x; return *this; }
custom_int& operator*=(const custom_int& y) { x *= y.x; return *this; }
};
using int_t = int;
vector<int_t> operator+(vector<int_t> u, const vector<int_t>& v) {
for(int i = 0; i < v.size(); i++) {
u[i] += v[i];
}
return u;
}
vector<int_t> operator*(vector<int_t> v, const int_t& scalar) {
for(auto& vi : v) {
vi *= scalar;
}
return v;
}
int main() {
vector<vector<int_t>> A = {{2, 1, 0}, {-1, 0, 0}, {1, 0, 1}};
vector<int_t> b = {3, 2, 2};
inner_product(A.begin(), A.end(), b.begin(), vector<int_t>(A[0].size()));
return 0;
}
但是,执行下列操作之一会使其编译:
- 更改为 .
using int_t = int;
using int_t = custom_int;
- 更改为
inner_product(A.begin(), A.end(), b.begin(), vector<int_t>(A[0].size()));
inner_product2(A.begin(), A.end(), b.begin(), vector<int_t>(A[0].size()));
为什么会这样?
答: 暂无答案
评论
operator+
std::vector
std
my_vector
std::vector
std::inner_product()
std::inner_product()
std::vector
std::inner_product