2013-08-06 36 views
2

好的,看起來我以前的問題現在已經解決了(我把它留在下面作爲參考)。然而,又一個人出現 - 再一次,似乎我失蹤了。另外在這片代碼,我宣佈:D中的參數化類型和返回值爲什麼這不起作用?

private: 

T _data; 
BinaryTree!(T) _left; 
BinaryTree!(T) _right; 

然後在此之後,我說過這些:

public: 
@property T data() {return _data;} 
@property BinaryTree!(T) left() {return _left;} 
@property BinaryTree!(T) right() {return _right;} 

然後,我實現了以下功能:

void add (T data) { 
    BinaryTree!(T) nearest = findNearest(this, data); 
    if (nearest.data > data) { 
     nearest.left = new BinaryTree!(T) (data); 
    } 
    else { 
     nearest.right = new BinaryTree!(T) (data); 
    } 
} 

編譯器是抗議最近的。左側和最近的右側不屬性,儘管最近的是BinaryTree!(T),但這似乎很奇怪。我錯過了什麼?


老問題:

我最近得到進入d,並試圖建立一個二叉樹實現作爲測試的方式是什麼我已經閱讀關於它的經驗教訓。現在,我開始通過如下聲明它:

class BinaryTree(T) 

我估計這將讓我的一些參數化的類包含的東西。更具體地講:

T _data; 
BinaryTree!(T) _left; 
BinaryTree!(T) _right; 

現在,我又試圖寫這樣的:

BinaryTree!(T) findNearest (BinaryTree(T) x, T key) { 
    if (x.hasNoChildren || x.data == key) { 
     return x; //found it 
    } 
    else { 
     auto compare = x.data; 
     if (compare > key) { 
      return find (x.left, key); 
     } 
     else { 
      return find (x.right, key); 
     } 
    } 
} 

在此之後,編譯器大聲抱怨沒有返回類型我的功能。我在這裏做錯了什麼?如果它有助於解釋,我來自Java背景,並且我在Xamarin Studio中使用了dmd編譯器。

+2

寫setters和一切都會工作。例如:'@property void left(BinaryTree!(T)left){_left = left; }' – sigod

+0

謝謝你。爲什麼這樣,出於興趣?我對'@ property'的理解是,我們可以調用像'tree.left'而不是'tree.getLeft()',這就是爲什麼我不確定爲什麼要使用'@ property' _setters_。 –

+0

而'tree.left = new_left;'爲'tree.setLeft(new_left);'。 http://dlang.org/property.html滾動到底部。 – sigod

回答

4

我能看到的唯一錯誤是在函數參數缺少!

BinaryTree!(T) findNearest (BinaryTree(T) x, T key) { 

應該

BinaryTree!(T) findNearest (BinaryTree!(T) x, T key) { 

其餘的看起來好像沒什麼問題。

+0

感謝您的快速回答!這似乎修復了它。但是,現在當我嘗試在主測試中遇到另一個錯誤時!我會給你所有的東西,以確保我沒有做一些愚蠢的事情:'module main; import std.stdio; import BinaryTree; (10);()()()()()()()()()()()()()()()()()() \t writeln(T.hasNoChildren); \t writeln(T。找到(10)); }' 問題具體是'auto T = new BinaryTree!int(10);'行。編譯器不喜歡它,因爲BinaryTree不是'模板聲明'。 –

+3

我認爲問題在於模塊和類型都被命名爲BinaryTree,因此您需要編寫'auto T = new BinaryTree.BinaryTree!int(10);' –

+3

注意,在D中,它是模塊名稱全部小寫更常見。如果模塊名稱與類名不同,那麼您可以使用'BinaryTree'而不必先指定模塊。 –

相關問題