我想编写自己的2d数组类。我希望类能够为这样的元素赋值。
a(0,0) = 1
我知道这一定是可能的,因为我可以使用blaze和eigen中的矩阵类来实现。我的第一个想法是重载函数运算符()
,它已经很好地访问元素。当我尝试使用a(0,2) = 0;
分配值时,我收到编译器错误。
lvalue required as left operand of assingment
我有什么操作员可以重载分配也有效?
答案 0 :(得分:8)
您需要使用此原型构建一个函数:
T& operator()(std::size_t, std::size_t);
T
是您的元素类型。此函数需要将引用返回到数组中的元素。这允许您通过调用者中的该引用修改元素的值。
除上述内容外,您还应该提供功能
const T& operator()(std::size_t, std::size_t) const;
用于只读元素访问。我宁愿教条地坚持std::size_t
进行索引。实际上,您可能希望自己的typedef
代表索引类型。
答案 1 :(得分:1)
您需要提供两个重载 - 一个const
而另一个不重载,返回引用。例如:
template <typename TVal> class val {
std::map<int, TVal> values;
public:
// the distinction is between a const version ...
TVal operator()(int key) const {
auto found = values.find(key);
if (found != values.end())
return found->second;
return TVal();
}
// ... and a non-const, returning a reference
TVal& operator()(int key) {
return values[key];
}
};
然后您可以按如下方式使用它:
val<int> v;
v(1) = 41;
v(1)++;
std::cout << v(1) << std::endl; // -> 42
std::cout << v(2) << std::endl; // -> 0
答案 2 :(得分:0)
请发布编译错误,让其他人看到并准确回答。
话虽如此,我很确定这是因为您没有从运营商处返回引用。