2017-01-26 40 views
0

私はC++でテンプレートを使用してプログラムを作成していますが、なぜコンパイルできないのか分かりません。"は、引数1を 'Node <T>'から 'std :: nullptr_t'に変換できません。

template<typename T> 
class Node { 
friend class Tree<T>; 

public: 
using nodePtr = std::shared_ptr<Node<T>>; 
Node(T value): 
    nodeValue(value), 
    leftSon(Node()), 
    rightSon(Node()), 
    isEmpty(false) { 
} 

Node(T value, nodePtr left, nodePtr right): 
    nodeValue(value), 
    leftSon(left), 
    rightSon(right), 
    isEmpty(false) { 
} 

Node(): 
    nodeValue(T()), 
    leftSon(nullptr), 
    rightSon(nullptr), 
    isEmpty(true) { 
} 

Node(nodePtr root): 
    nodeValue(root->nodeValue), 
    leftSon(root->leftSon), 
    rightSon(root->rightSon), 
    isEmpty(root->isEmpty) { 
} 

Node(const nodePtr& copied): 
    nodeValue(copied.nodeValue), 
    leftSon(copied.leftSon), 
    rightSon(copied.rightSon), 
    isEmpty(copied.isEmpty) { 
} 

private: 
T nodeValue; 
nodePtr leftSon; 
nodePtr rightSon; 
bool isEmpty; 
}; 

とツリー::

私はクラスのノードを持っている私は、main関数内

Tree<int>::createValueNode(7); 

を使用している場合は

template<typename T> 
class Tree { 
using nodePtr = std::shared_ptr<Node<T>>; 

nodePtr root; 

public: 
static nodePtr createEmptyNode() { 
    return std::make_shared<Node<T>>(); 
} 

static nodePtr createValueNode(T value) { 
    return std::make_shared<Node<T>>(value); 
} 

static nodePtr createValueNode(T value, nodePtr left, nodePtr right) { 
    return std::make_shared<Node<T>>(value, left, right); 
} 
}; 

、Visual Studioのコンパイラはエラーで終了します。

C2664 
'std::shared_ptr<Node<T>>::shared_ptr(std::shared_ptr<Node<T>> &&) noexcept': 
cannot convert argument 1 from 'Node<T>' to 'std::nullptr_t' 
+0

どのコンパイラを使用しますか? –

+0

< Nodeを書くようにしてください - > –

+0

の間にスペース記号を追加してください私はどのデバッガであるのか分かりません。オプションについては、「起動するデバッガ:ローカルWindowsデバッガ」を参照してください。 –

答えて

0

コメントで指摘したように、問題はNodeクラスの最初のコンストラクタです。あなたはこのようなNULL値でそれを変更することができます:

Node(T value): 
    nodeValue(value), 
    leftSon(nullptr), 
    rightSon(nullptr), 
    isEmpty(false) { 
} 

また、このような新しいNodeクラスを初期化することができます:あなたが使用する

Node(T value): 
    nodeValue(value), 
    leftSon(new Node()), 
    rightSon(new Node()), 
    isEmpty(false) { 
} 

ソリューションは、関数の意味に依存します。

1

エラーメッセージは確かに不明です。打ち鳴らす一つが優れている:あなたが望むものに依存

Node(T value): 
    nodeValue(value), 
    leftSon(), 
    rightSon(), 
    isEmpty(false) { 
} 

error: no matching constructor for initialization of ' nodePtr ' (aka shared_ptr<Node<int> > ')

leftSon(Node()), 
^  ~~~~~~ 

エラーはここ

Node(T value): 
    nodeValue(value), 
    leftSon(Node()), // <- 
    rightSon(Node()), // <- 
    isEmpty(false) { 
} 

それがあるべきです。

+0

私のコメントから5分遅れてコピーされました。 –

+0

@KakamiOkatsu:正直なところ、clang/gccでコンパイルして解決策を見つけた後、あなたのコメントが表示されます。 – Jarod42

関連する問題