2013-08-06 28 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'而不必先指定模块。 –

相关问题