0

这是正确使用 reinterpret_cast 还是有更好的方法来解决问题。

Node<T>* front_;

Iterator<const T> GetConstIterator() const {
  return Iterator<const T>(reinterpret_cast<Node<const T>*>(front_));
}

Iterator<T> GetIterator() {
  return Iterator<T>(front_);
}

迭代器的构造函数定义为this。

template<class T>
class Iterator {
  explicit Iterator(Node<T>* const node) : node_(node) {}
  ...
}
4

2 回答 2

0

您需要使您的 const 版本的迭代器可以从非常量节点构造。然后我会重写 getter 以更符合 STL:

Iterator<const T> begin() const { return Iterator<const T>(front_); }
Iterator<T> begin() { return Iterator<T>(front_); }

您需要做的就是编译第一个版本。Casting 在这里不起作用,因为Node<T>不会与Node<const T>.

于 2013-04-03T19:22:13.417 回答
0

使用 reinterpret_cast 来抛弃 const-ness 是非法的。您需要为此使用 const_cast 。您可以使用reinterpret_cast来添加 const-ness,但 aconst_cast对于未来的维护者来说更正确和更明显。

从 §5.2.10 重新解释演员表,p2:

reinterpret_cast 运算符不应抛弃 constness (5.2.11)。整数、枚举、指针或指向成员类型的表达式可以显式转换为它自己的类型;这样的强制转换会产生其操作数的值。

真的,构造函数Node<const T>应该能够隐式地做到这一点,甚至不需要强制转换。

歧义源于您的功能:

Iterator<T> GetIterator() const {
  return Iterator<T>(front_);
}

您不应该返回一个可以将容器变异为 const 方法的迭代器。此方法不应具有 const 限定符。

你应该有:

Iterator<const T> GetIterator() const {
  return Iterator<const T>(front_);
}

Iterator<T> GetIterator() {
  return Iterator<T>(front_);
}
于 2013-04-03T23:29:13.983 回答