2011-08-17 35 views
1

這是我第一次進入C++模板,我試圖構建一個BinaryTree模板來幫助我處理Project Euler問題;但是,我似乎得到一個錯誤,其中BinaryTree類不承認BinaryTreeNode的所有構造函數!這是代碼的一小部分。C++模板限制成員構造函數

template <class T> 
class BinaryTreeNode 
{ 
private: 
    BinaryTreeNode<T>* _left; 
    BinaryTreeNode<T>* _right; 
    T* _value; 

public: 
    BinaryTreeNode(); 
    explicit BinaryTreeNode(const T& value) : _value(&(T(value))) {} 
    BinaryTreeNode(BinaryTreeNode<T>& left, BinaryTreeNode<T>& right, const T& value) : 
     _left(&left), _right(&right), _value(&(T(value))){} 
}; 

的二叉樹類

#include "BinaryTreeNode.h" 
template <class T> 
class BinaryTree 
{ 
private: 
    BinaryTreeNode<T>* _root; 
    BinaryTreeNode<T>* _current; 
    unsigned int size; 

public: 
    BinaryTree() : size(0), _root(0), _current(0) { } 
    explicit BinaryTree(BinaryTree<T>& leftTree, BinaryTree<T>& rightTree, const T& value) : 
     size(leftTree.Size() + rightTree.Size() + 1), _root(leftTree.Root(), rightTree.Root(), value), _current(_root) {} 
    explicit BinaryTree(const T& value) : size(1), _root(value) {} 
    const BinaryTreeNode<T>& Root() const { return *_root;} 
}; 

我得到這些錯誤。

error C2359: 'BinaryTree<T>::_root' : member of non-class type requires single initializer expression 
error C2440: 'initializing' : cannot convert from 'const int' to 'BinaryTreeNode<T> *' 
error C2439: 'BinaryTree<T>::_root' : member could not be initialized 

BinaryTreeNode構造(BinaryTreeNode<T>&, BinaryTreeNode<T>&, const T& value)作品,當我有它在我的主代碼,但它似乎並沒有在我的BinaryTree模板的工作。有人知道爲什麼

+2

您在課程結束時缺少';'。 'explicit'關鍵字只對具有單個參數的構造函數有用。 '_value(&(T(value)))'用一個臨時指針初始化_value,該指針將在語句後立即被銷燬,導致一個懸掛指針。 'BinaryTreeNode :: BinaryTreeNode()'被聲明但沒有定義,這是故意的嗎?如果是這樣,你應該保密。 –

+0

@Luc Touraille真的是一個很好的答案,而不是評論。 – neuront

+0

@neuront不是真的,因爲我沒有花時間去發現真正的問題,這只是我發現的一些問題。 –

回答

4

在你的初始化表達式_root(leftTree.Root(), rightTree.Root(), value)_root指針。您只能將它初始化爲另一個指針。也許你的意思是將它初始化爲一個指向在這些參數上構造的新節點的指針?

這可能就像這樣:

_root(new BinaryTreeNode<T>(leftTree.Root(), rightTree.Root(), value)) 

然而,這是非常危險的(想想在分配的除外)(你的編輯後更新),你或許應該避免使用原始指針在你的課堂設計中,而是使用智能管理指針。

同樣,初始化_root(value)不會做錯事,你可能想:

_root(new BinaryTreeNode<T>(value)) 

(另請注意,你應該在其聲明的順序初始化成員。)

更新:我改變了第一構造函數調用跟隨你的編輯,但正如@Luc所說,你的構造函數採用非const參數,但Root()只提供了一個const引用,所以你仍然需要修復它。

+0

你的直接解決方案不起作用,但它看起來像我將不得不調查(谷歌)智能指針。編輯:從你的直接解決方案,我得到'不能將參數1從'常量BinaryTreeNode '轉換爲'BinaryTreeNode &' –

+0

你不是說'Root()'函數做什麼,所以我做了一些猜測工作。提供更多細節,我們可以看看。一個'std :: shared_ptr'對你的情況來說可能是一個好的開始。 –

+0

另一個編輯錯誤,我應該在提交之前校對我的問題!無論如何,我添加了Root功能。 –

0

我相信,你需要一個構造函數形式BinaryTree<T>();

+0

不,不是,只是試了一下!問題出自'明確的BinaryTree(BinaryTree &,BinaryTree &,const T&)'構造函數。感謝您的建議。 –

3

在兩次課堂申報後你都錯過了;

template <class T> 
class BinaryTreeNode 
{ 
private: 
    BinaryTreeNode<T>* _left; 
    BinaryTreeNode<T>* _right; 
    T* _value; 

public: 
    BinaryTreeNode(); 
    explicit BinaryTreeNode(const T& value) : _value(&(T(value))) {} 
    BinaryTreeNode(BinaryTreeNode<T>& left, BinaryTreeNode<T>& right, const T& value) : 
     _left(&left), _right(&right), _value(&(T(value))){} 
}; 

template <class T> 
class BinaryTree 
{ 
private: 
    BinaryTreeNode<T>* _root; 
    BinaryTreeNode<T>* _current; 
    unsigned int size; 

public: 
    BinaryTree() : size(0), _root(0), _current(0) { } 
    explicit BinaryTree(BinaryTree<T>& leftTree, BinaryTree<T>& rightTree, const T& value) : 
     size(leftTree.Size() + rightTree.Size() + 1), _root(leftTree.Root(), rightTree.Root(), value), _current(_root) {} 
    explicit BinaryTree(const T& value) : size(1), _root(value) {} 
}; 
+0

複製錯誤!將修復原始帖子。雖然好,但;) –