1

ブースト共有ポインターを使用してバイナリ ツリーを構築し、ノードを STL マップに格納しようとしています。一般的なバイナリ ツリーの例を取り上げ、次のようにポインターを shared_ptr に変換しようとしました。テンプレートを使用するのは良い考えだと思ったので、必要以上に複雑にした可能性があります。

#include <iostream>
#include <string>
#include <map>
using namespace std;

#include "boost/smart_ptr.hpp"

//typedef boost::shared_ptr<node<int> >  nodePtr;

template <typename T>
class node
{
public:

    T nodeData;
    boost::shared_ptr<node<T> > *left, *right;

    // default constructor. data not initialized
    node() {}

     // initialize the data members
    node (const T& item, 
          boost::shared_ptr<node<T> > lptr = NULL, 
          boost::shared_ptr<node<T> > rptr = NULL) :
          nodeValue(item), left(lptr), right(rptr) {}
};

template <typename T>
void inorderOutput(boost::shared_ptr<node<T> > t)
{
   // the traversal terminates on a empty subtree
   if (t != NULL)
   {
      inorderOutput(t->left);       // descend left
      cout << t->nodeData << ", ";  // output the node
      inorderOutput(t->right);      // descend right
   }
}

int main()
{
    // a few nodes to assemble into a tree
    boost::shared_ptr<node<char> > d( new node<char>('D') );
    boost::shared_ptr<node<char> > e( new node<char>('E') );
    boost::shared_ptr<node<char> > f( new node<char>('F') );
    boost::shared_ptr<node<char> > g( new node<char>('G') );

    boost::shared_ptr<node<char> > b( new node<char>('B',d, e) );
    boost::shared_ptr<node<char> > c( new node<char>('C',f, g) );
    boost::shared_ptr<node<char> > a( new node<char>('A',b, c) );

    // now store the node pointers for later reference
    map<string, boost::shared_ptr<node<char> > > nodeMap;
    nodeMap["D"] = d;
    nodeMap["A"] = a;
    // etc.

    // inorder traversal of nodes  
    cout << "Inorder:      " ;
    inorderOutput(a);
    cout << endl;

    // Test to see if a node has children
    if (( nodeMap["A"]->left != NULL ) || (nodeMap["A"]->right != NULL ) ) 
    {
        cout << "Node A has children!" << endl;
    }

    return 0;
}

Visual Studio Express 2010 でビルドすると、次のエラーが発生します。

1>  SharedPtr.vcxproj -> c:\users\john\documents\visual studio 2010\Projects\SharedPtr\Debug\SharedPtr1.exe
2>c:\users\john\documents\visual studio 2010\projects\sharedptr\sharedptr2\sharedptr2.cpp(27): error C2440: 'default argument' : cannot convert from 'int' to 'boost::shared_ptr<T>'
2>          with
2>          [
2>              T=node<char>
2>          ]
2>          No constructor could take the source type, or constructor overload resolution was ambiguous
2>c:\users\john\documents\visual studio 2010\projects\sharedptr\sharedptr2\sharedptr2.cpp(49): fatal error C1903: unable to recover from previous error(s); stopping compilation

ノード コンストラクタが正しく定義されていないようです。私はしばらくの間、自分が間違っていることを理解しようとしています (おそらくいくつかのことです!)。また、これをコンパイルできると仮定すると、ノードの子のテストは機能しますか? 以前の実験では、これは簡単ではないと信じる理由がいくつかありました。最後に、リストの一番上にある typdef も適切に使用していなかったため、コメントアウトしました。このコードをクリーンアップする方法を提案できる人はいますか?

ジョン

4

2 に答える 2

3

変化する

 node (const T& item, 
      boost::shared_ptr<node<T> > lptr = NULL, 
      boost::shared_ptr<node<T> > rptr = NULL) :
      nodeValue(item), left(lptr), right(rptr) {}
 };

 node (const T& item, 
      const boost::shared_ptr<node<T> >& lptr = boost::shared_ptr<node<T> >(), 
      const boost::shared_ptr<node<T> >& rptr = boost::shared_ptr<node<T> >()) :
      nodeValue(item), left(lptr), right(rptr) {}
 };

指摘したように、「左」と「右」を非ポインターboost_shared_ptrにします。

于 2013-01-02T01:21:12.697 に答える
2

NULL#defineほとんどの実装で 0 にしますか? 推測でboost::shared_ptrはどうしたらよいかわかりません。

変化する

boost::shared_ptr<node<T> > *left, *right;

boost::shared_ptr<node<T> > left, right;

node (const T& item, 
      boost::shared_ptr<node<T> > lptr = NULL, 
      boost::shared_ptr<node<T> > rptr = NULL) :

node (const T& item, 
      boost::shared_ptr<node<T> > lptr = boost::shared_ptr<node<T> >(), 
      boost::shared_ptr<node<T> > rptr = boost::shared_ptr<node<T> >()) :
于 2013-01-02T01:18:54.973 に答える