0

C++ テンプレートで単純なバイナリ ツリーを作成しようとしています。main() の 2 行目で、宣言したい

Node<string,Node,int> 

2 番目のノードは間違っています。これはクラス テンプレートであるため、次のようにインスタンス化する必要があります。

Node<string,Node<string,int,int>,int>

しかし、ツリーが成長するにつれて、タイプが成長します。最初の宣言をどのように使用できますか? ありがとう!

私の C++ コンパイラは g++ 4.8.1 で、C++11 をサポートしています。

#include <iostream>
#include <string>

using namespace std;

template<typename T, typename Tl, typename Tr>
struct Node {
  // tree node
  T top;
  Tl left;
  Tr right;
  Node (const T& t=T(),const Tl& tl=Tl(),const Tr& tr=Tr()):
    top(t), left(tl), right(tr){}

};

int main() {
  Node <string,int,int> n1 (string("+"), 1, 2);
  // !!!wrong , should be Node<string,Node<string,int,int>,int>
  Node<string,Node,int> n2 (string("*"), n1, 4);
}

アップデート:

構造体へのポインタを追加します。それをより良くする方法は?ありがとう!

#include <iostream>
#include <string>

using namespace std;

template<typename T=string, typename Tl=int, typename Tr=int>
struct Node {
  // tree node
  struct Node<T,Tl,Tr>* p_left;
  struct Node<T,Tl,Tr>* p_right;
  T top;
  Tl left;
  Tr right;
  Node (struct Node<T,Tl,Tr>* pl=nullptr, struct Node<T,Tl,Tr>* pr=nullptr,
        const T& t=T(),const Tl& tl=Tl(),const Tr& tr=Tr()):
    p_left(pl), p_right(pr), top(t), left(tl), right(tr){}
};

using tnode = struct Node<>;

int main() {
  tnode n1 (nullptr,nullptr,string("+"), 1, 2);
  tnode n2 (&n1, nullptr,string("*"), 0,0);
}

UPDATE 2、スマートポインターを追加します。

#include <iostream>
#include <string>
#include <memory>

using namespace std;

template<typename T=string, typename Tc=int>
class Node {
public:
  Node (shared_ptr<Node> pl=nullptr, 
        shared_ptr<Node> pr=nullptr,
        const T& t=T(),
        const Tc& tl=Tc(),
        const Tc& tr=Tc()):
    p_left(pl), p_right(pr), v_top(t), v_left(tl), v_right(tr){}

  ~Node() {
    cout<<"Calling destructor"<<endl;
  }
private:
  shared_ptr<Node> p_left;
  shared_ptr<Node> p_right;
  T v_top;
  Tc v_left,v_right;
};

using tNode = Node<>;
using spNode = shared_ptr<tNode>;

spNode create_tree() {
  spNode n0 = make_shared<tNode>(nullptr,nullptr,string("*"), 7, 3);
  spNode n1 = make_shared<tNode>(nullptr,n0,string("+"), 5, 6);
  spNode n2 = make_shared<tNode>(n1, nullptr,string("+"), 3,4);
  return n2;    
}

int main() {
  spNode n2 = create_tree();
}
4

1 に答える 1

0

を取り、2 つの子パラメーターtemplate<typename>class NodeMakerの親タイプに渡します。Node

template<typename T>using Same=T;templatestruct fixed{templateusing type=X;}`を書きます。

今、

Node<string, Same, fixed<int>::template type>

ご希望の型をお作りします。

Node問題として、このタイプのサイズは無限大です。内部Nodeが消える方法が必要です。std::unique_ptr<>左と右の子供を保持するために使用しますか?

于 2013-06-26T23:51:48.420 に答える