これは私に悩まされています。明らかに私は何かを逃したので、誰かがそれが何であるか教えてくれることを願っています。shared_from_this()はstd :: shared_ptrを返します。<const X>ではなくstd :: shared_ptr <X>
私はC++ 17ライブラリを開発しています。私はNode
オブジェクトとカスタム反復子、Node::iterator
からなるカスタムツリーデータ構造を作成しました。私は親クラスTree
に標準イテレータ法(begin()
、end()
、およびconstの同等物)を追加すると
template class NodeIterator<Node>;
template class NodeIterator<const Node>;
、私はできる...
template <typename T>
class NodeIterator {
public:
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = std::shared_ptr<T>;
using reference = T&;
using iterator_category = std::forward_iterator_tag;
NodeIterator() = default;
NodeIterator(pointer n);
// Etc.
}
以降:イテレータはこのようになりますイテレータの初期値を制御します。だから私は_root
がstd::shared_ptr<Node>
ある
Node::iterator Tree::begin() const {
return Node::iterator(_root);
}
を言うことができます。これは素晴らしいです。
しかし、コンテンツだけでは十分ではありませんが、私はこれらのイテレータメソッドをノード自体に必要とします。そうすれば、どのノードからもサブツリーをたどることができ、Tree
クラスを削除して、Node
オブジェクトを渡すだけです。
は私がNode
class Node : public std::enable_shared_from_this<Node> {
public:
using iterator = NodeIterator<Node>;
using const_iterator = NodeIterator<const Node>;
iterator begin() const;
iterator end() const;
const_iterator cbegin() const;
const_iterator cend() const;
// Etc.
}
を宣言して、大声でreturn
声明文句
Node::iterator Node::begin() const {
return Node::iterator(this->shared_from_this());
}
Node::iterator Node::end() const {
return Node::iterator(nullptr);
}
Node::const_iterator Node::cbegin() const {
return Node::const_iterator(this->shared_from_this());
}
Node::const_iterator Node::cend() const {
return Node::const_iterator(nullptr);
}
としてコンパイラをイテレータメソッドを定義します。
src/node.cc:79:9: error: no matching conversion for functional-style cast from
'shared_ptr<const Node>' to 'Node::iterator' (aka 'NodeIterator<Node>')
return Node::iterator(this->shared_from_this());
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以降を...
include/example.h:344:2: note: candidate constructor not viable: no known
conversion from 'shared_ptr<const Node>' to 'shared_ptr<Node>' for
1st argument
NodeIterator(pointer n);
^
別の方法では、では、親ノード(std::shared_ptr<Node>
)を自動的にthis->shared_from_this()
に設定しても問題なく動作します。
私がNode::begin()
とNode::end()
をコメントアウトし、私のループにcbegin()
とcend()
しか使用しないと、うまくいきます。
何がありますか?
メンバ関数のうちの1つが 'const'であり、もう1つはそうではありませんか? –