[疑难] Help!
Colorful
2007-09-18
示例代码如下:
public class AClass { public int I; } void main() { /+ foreach(AClass a; arrayA) { printf("%d\n", a.I); } +/ for(int i=0; i<arrayA.length; i++) { printf("%d\n", arrayA[i].I); } } 偶的开发环境是 DMD 2.004 + Phobos(Windows版)。 上面的代码运行结果是 Error: Access Violation. 偶费了老大劲也没看出是哪里的问题导致非法内存访问。 郁闷~ |
|
Colorful
2007-09-18
继续报告错误。
void main() { AClass[] arrayA = new AClass[10]; arrayA[0].I = 2; arrayA[1].I = 6; arrayA[2].I = 3; arrayA[3].I = 9; arrayA[4].I = 10; arrayA[5].I = 8; arrayA[6].I = 7; arrayA[7].I = 1; arrayA[8].I = 5; arrayA[9].I = 4; InsertionSort!(AClass)(arrayA); for(int i=0; i<arrayA.length; i++) { printf("%d\n", arrayA[i].I); } } public void InsertionSort(T : IComparable!(T))(T[] array) { for(int i = 1; i < array.length; i++) { T temp = array[i]; int j = i; for(; j > 0 && temp.CompareTo(array[j-1]) < 0; j--) { array[j] = array[j-1]; } array[j] = temp; } } public interface IComparable(T) { int CompareTo(T other); } public class AClass : IComparable!(AClass) { public int I; public int CompareTo(AClass other) { if(other is null) return 1; if(this.I < other.I) return -1; if(this.I > other.I) return 1; if(this.I == other.I) return 0; } } 上面的代码不能通过编译! 说是模板实例跟模板的声明不能相匹配。 |
|
qiezi
2007-09-18
void InsertionSort(T : IComparable!(T))(T[] array)
D并没有支持这种特化方式,它的模板类型推导还没有这么强,改成这样就行了: void InsertionSort(T)(T[] array) |
|
qiezi
2007-09-18
Colorful 写道 示例代码如下:
public class AClass { public int I; } void main() { /+ foreach(AClass a; arrayA) { printf("%d\n", a.I); } +/ for(int i=0; i<arrayA.length; i++) { printf("%d\n", arrayA[i].I); } } 偶的开发环境是 DMD 2.004 + Phobos(Windows版)。 上面的代码运行结果是 Error: Access Violation. 偶费了老大劲也没看出是哪里的问题导致非法内存访问。 郁闷~ 你只是分配了一个数组,并没有把数组里的内容初始化,改成这样: AClass[] arrayA = new AClass[10]; foreach(ref e; arrayA) e = new AClass; arrayA[0].I = 2; arrayA[1].I = 6; //... |
|
Colorful
2007-09-18
那么如何保证T是继承自IComparable(T)接口呢?
|
|
Colorful
2007-09-18
晕,偶的第一段代码贴错了。
|
|
Colorful
2007-09-18
晕了,下面的代码是错误的。
咋编辑功能不好用呢? |
|
Colorful
2007-09-18
偶那个郁闷!
void InsertionSort(T: IComparable!(T))(T[] array) { //... } 这个不能推导,但是is表达式可以推导。 把上面的代码改成 void InsertionSort(T)(T[] array) { static if( is ( T : IComparable!(T) ) ) { //... } else { static assert(false, "Argument must be derived from interface IComparable(T)."); } } 也算是曲线救国吧。 |
|
redsea
2007-09-19
那你为什么不直接一个 static assert(is ( T : IComparable!(T) ) ) ?
Colorful 写道 偶那个郁闷!
void InsertionSort(T: IComparable!(T))(T[] array) { //... } 这个不能推导,但是is表达式可以推导。 把上面的代码改成 void InsertionSort(T)(T[] array) { static if( is ( T : IComparable!(T) ) ) { //... } else { static assert(false, "Argument must be derived from interface IComparable(T)."); } } 也算是曲线救国吧。 |