したがって、基底クラスと派生クラスのテンプレートを使用しています 派生クラスを削除しようとするまで、うまく動作します。 私は、またはテンプレートなしでワンピースとして派生クラスを作りテストし、それがうまく働いたが、私はそれを分割する際にこれがC++のテンプレートクラスは、破棄時に無限ループを引き起こします
template<class T>
class NodeTT: public Node
{
private:
T _data;
public:
NodeTT(Node* parent = nullptr):Node(parent){}
NodeTT(T data, Node* parent = nullptr):Node(parent),_data(data){}
~NodeTT(){std::cout<<"deriv destr"<<std::endl;}
void show(){
std::cout<<_data<<std::endl;
for(Node* childNode : _children)childNode->show();
}
};
同じ正常に動作します
.Hとの.cppファイル私は取得していますエラーのために二つのファイル
HEADER
#include <iostream>
#include <node.h>
template<class T>
class TNode: public Node
{
private:
T _data;
public:
TNode(Node* parent = nullptr);
TNode(T data, Node* parent = nullptr);
~TNode();
void show();
};
SOURCE
template<class T>
TNode<T>::TNode(Node *parent) : Node(parent){}
template<class T>
TNode<T>::TNode(T data, Node* parent): Node(parent),_data(data){}
template<class T>
TNode<T>::~TNode(){
std::cout<<"deriv destr"<<std::endl;
}
template<class T>
void TNode<T>::show(){
std::cout<<_data<<std::endl;
for(Node* childNode : _children)childNode->show();
}
template class TNode<int>;
template class TNode<float>;
template class TNode<std::string>;
におけるクラスと基底クラスのデストラクタこの
Node::~Node(){
std::cout<<"base destr"<<std::endl;
for(Node* childNode : _children)
{
delete childNode;
}
delete _parentNode;
_children.clear();
}
の出力に無限のメッセージ "base destr"が表示されるので、間違いを指摘する助けとなります。
私の英語のために申し訳ありません。
あなたの間違いは、[mcve]の要件を満たしていない、あなたの質問にランダムなビットのコードを含むことです。投稿したものを取り出してコンパイルし、問題を再現することはできません。 –
必ずしもあなたの問題に関連しているわけではありませんが、仮想デストラクタを持つことを検討してください... – AlexG
'delete _parentNode;' - それは非常に疑わしいです。 –