我有以下代码:
ValueType& operator[](KeyType target) {
Pair<KeyType, ValueType> * result = find(target);
if (result != nullptr) {
return result->getSecond();
}
}
我得到了这个编译时错误:“return无法从int转换为int&amp;”。我可以通过在方法前添加一个const来编译它,但之后我可以使用[]运算符来访问元素而不是更改它们。我尝试的另一件事是将返回类型更改为ValueType&amp;&amp;但我真的不明白它是如何工作的。我仍然无法使用[]运算符访问和修改元素。通常这适用于我,但现在我使用的是模板。这会给我带来麻烦吗?
答案 0 :(得分:4)
我必须在这里猜一下,但看起来你的Pair
类可能是这样写的:
template <typename First, typename Second>
class Pair {
private:
First first_;
Second second_;
public:
// ...
First getFirst() { return first_; }
Second getSecond() { return second_; }
};
如果第一个和第二个不是自己的引用类型,那么您的operator[]
将绑定对本地的引用(不是很好)。
您在Pair
中可能需要的是返回参考
template <typename First, typename Second>
class Pair {
private:
First first_;
Second second_;
public:
// ...
First& getFirst() { return first_; }
Second& getSecond() { return second_; }
// and const versions as well
const First& getFirst() const { return first_; }
const Second& getSecond() const { return second_; }
};
为什么有const版本?因为如果你有一个const Pair
,你仍然希望能够查看我假设的数据,请考虑像
const Pair<KeyType, ValueType> * result = find(target);
std::cout << result->getFirst() << '\n';
如果您没有getFirst()
的const重载,则上述调用将失败。这对您来说很重要,因为大多数情况下,operator[]();
您希望operator[]() const;
同时使用import matplotlib.pyplot as plt
plt.style.use('classic')
plt.rcParams.update({'font.size': 18.0})
x = [0, 1, 2, 3]
y = [0, 1, 4, 9]
fig, ax0 = plt.subplots()
ax0.plot(x, y)
ax0.set_xlabel('data x')
ax0.set_ylabel('data y')
plt.show()
。
如果你看一下标准容器,你会看到我在说什么。例如std::vector::operator[]
。