这是正确使用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_);
}
迭代器的构造函数定义为。
template<class T>
class Iterator {
explicit Iterator(Node<T>* const node) : node_(node) {}
...
}
答案 0 :(得分:0)
您需要使您的const版本的迭代器可以从非const节点构造。然后我会重写getter以更符合STL:
Iterator<const T> begin() const { return Iterator<const T>(front_); }
Iterator<T> begin() { return Iterator<T>(front_); }
您需要做的就是让第一个版本编译。由于Node<T>
与Node<const T>
无关,因此投放无效。
答案 1 :(得分:0)
使用reinterpret_cast抛弃常量是违法的。你需要使用const_cast。您可以使用reinterpret_cast
来添加常量,但const_cast
对于未来的维护者来说更正确,更明显。
从§5.2.10重新解释演员表,第2页:
reinterpret_cast运算符不应丢弃constness(5.2.11)。 整数,枚举,指针或指向成员的指针的表达式 type可以显式转换为自己的类型;这样的演员收益率 其操作数的值。
实际上,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_);
}