gpt4 book ai didi

C++通用模板化类算术

转载 作者:行者123 更新时间:2023-11-30 04:56:23 26 4
gpt4 key购买 nike

假设我们正在处理一个类,由于某种原因必须进行一些算术运算。

tensor_sum 这样的运算有重载的运算符模板。这种方法的问题似乎是这样的:

g++ main.cpp -o main
main.cpp: In instantiation of ‘tensor_sum<T0, T1>::value_type&

tensor_sum<T0, T1>::operator()(unsigned int) const [with T0 = tensor<int>; T1 = tensor<int>; tensor_sum<T0, T1>::value_type = int; typename T0::value_type = int; typename T1::value_type = int]’:
main.cpp:46:20: required from here
main.cpp:11:63: error: no match for call to ‘(const tensor<int>) (unsigned int&)’
value_type & operator () (unsigned int i) const { return t0_(i) + t1_(i); }
~~~^~~
main.cpp:32:7: note: candidate: T& tensor<T>::operator()(unsigned int) [with T = int] <near match>
T & operator () (unsigned int i) { return values_[i]; }
^~~~~~~~
main.cpp:32:7: note: passing ‘const tensor<int>*’ as ‘this’ argument discards qualifiers
main.cpp:11:72: error: no match for call to ‘(const tensor<int>) (unsigned int&)’
value_type & operator () (unsigned int i) const { return t0_(i) + t1_(i); }
~~~^~~
main.cpp:32:7: note: candidate: T& tensor<T>::operator()(unsigned int) [with T = int] <near match>
T & operator () (unsigned int i) { return values_[i]; }
^~~~~~~~
main.cpp:32:7: note: passing ‘const tensor<int>*’ as ‘this’ argument discards qualifiers

出于某种原因,我无法访问该值。但是我重载了 () 运算符

这里是代码:

#include <iostream>
#include <vector>

template<typename T0, typename T1>
struct tensor_sum {
typedef decltype(typename T0::value_type() + typename T1::value_type()) value_type;

public:
tensor_sum(const T0 &t0, const T1 &t1) : t0_(t0), t1_(t1) {}

value_type & operator () (unsigned int i) const { return t0_(i) + t1_(i); }

private:
const T0 &t0_;
const T1 &t1_;
};

template<typename T0, typename T1>
tensor_sum<T0, T1> operator + (const T0 &t0, const T1 &t1) { return tensor_sum<T0, T1>(t0, t1); }

template<typename T0, typename T1>
tensor_sum<T0, T1> operator + (const T0 &t0, const T1 &t1);

template<typename T>
struct tensor {
typedef T value_type;

public:
tensor(const unsigned int s = 0) : size_(s), values_(std::vector<T>(s)) {}
tensor(const tensor<T> &t) : size_(t.size_), values_(std::vector<T>(t.values_)) {}

T & operator () (unsigned int i) { return values_[i]; }
tensor<T> & operator = (const tensor<T> &t) { return tensor<T>(t); }

private:
const unsigned int size_;
std::vector<T> values_;
};

int main() {
tensor<int> t0(10);
tensor<int> t1(10);

tensor_sum<tensor<int>, tensor<int>> ts = t0 + t1;

std::cout << ts(2) << std::endl; //Can't access value.. why?

return 0;
}

Live example

最佳答案

tensor_sum<T0, T1> operator + (const T0 &t0, const T1 &t1);

返回一个 tensor_sum 而张量没有 operator= with tensor_sum。

所以你的代码意味着 t0 + t1 返回一个 tensor_sum 并尝试分配给一个张量,当然失败了。

关于C++通用模板化类算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52552145/

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