C ++ return无法从int转换为int&

时间:2018-03-29 19:42:38

标签: c++ templates reference

我有以下代码:

ValueType& operator[](KeyType target) {
        Pair<KeyType, ValueType> * result = find(target);
        if (result != nullptr) {
            return result->getSecond();
        }
    }

我得到了这个编译时错误:“return无法从int转换为int&amp;”。我可以通过在方法前添加一个const来编译它,但之后我可以使用[]运算符来访问元素而不是更改它们。我尝试的另一件事是将返回类型更改为ValueType&amp;&amp;但我真的不明白它是如何工作的。我仍然无法使用[]运算符访问和修改元素。通常这适用于我,但现在我使用的是模板。这会给我带来麻烦吗?

1 个答案:

答案 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[]