www.digitalmars.com         C & C++   DMDScript  

D - How to instantiate a template? Bug?

reply "Andres Rodriguez" <rodriguez ai.sri.com> writes:
Here is a minimalist ArrayList implementation using templates.  Everything
compiles fine, until I throw the second test file in the mix.

I tried using the same syntax from the Christopher E. Miller example of a
linked
list.

The trouble seems to be the method 'addAll', because if I comment it out,
eveything
compiles.  But the weird thing is that MyArrayList compiles fine without the
test
file at the end, is only after adding that file that I get the compilation
error.

I get the following error:

 cd c:/dev/d/util/src/sri/util/test/
 make -k -f c:/dev/d/util/Makefile compile
 \dmd\bin\dmd -c -od\dev\d\util\bin -I\dev\d\util\src -release

 \dmd\bin\dmd -c -od\dev\d\util\bin -I\dev\d\util\src -release

 template instance MyArrayList!(char[]) MyArrayList is not a template

 make: *** [sri-util-test] Error 1
 make: Target `compile' not remade because of errors.

 Compilation exited abnormally with code 2 at Sun Feb 01 08:40:29

Thanks in advance, Andres ***** File MyArrayList ******************************************************* module java.util.MyArrayList; public class MyArrayList(T) { //~ ATTRIBUTE(S) --------------------------------------------------------- private int length = 0; private T[] data; //~ CONSTRUCTOR(S) ------------------------------------------------------- public this() { } public this(MyArrayList!(T) c) { addAll(c); } public this(int initialCapacity) { data.length = initialCapacity; } //~ METHOD(S) ------------------------------------------------------------ public boolean add(T o) { ensureCapacity(length+1); data[length++] = o; return true; } public void add(int index, T element) { ensureCapacity(length+1); for (int i = length - 1; i > index; i--) data[i] = data[i-1]; data[index] = element; } public boolean addAll(MyArrayList!(T) c) { boolean modified = false; for (int i = 0; i < c.length; i++) { if (add(c.get(i))) modified = true; } return modified; } public void clear() { data.length = 0; } public boolean contains(T o) { for (int i = 0; i < length; i++) if (o == data[i]) return true; return false; } public void ensureCapacity(int minCapacity) { if (minCapacity > data.length) data.length = (data.length == 0? 10 : 2 * data.length); } public T get(int index) { return data[index]; } public boolean isEmpty() { return length == 0; } public T remove(int index) { T o = data[index]; length--; for (int i = index; i < length; i++) data[i] = data[i+1]; return o; } public boolean remove(T o) { int lag = 0; for (int i = 0; i < length - lag; i++) { if (o == data[i]) lag++; if (lag > 0) data[i] = data[i+lag]; } length -= lag; return lag > 0; } public T set(int index, T element) { return data[index] = element; } public int size() { return length; } } ***** File TestMyArrayList *************************************************** module sri.util.test.TestMyArrayList; import sri.util.MyArrayList; public class TestMyArrayList { protected void buildArrayList() { MyArrayList!(char[]) al = new MyArrayList!(char[]); al.add("a"); al.add("c"); al.add("u"); al.add("n"); al.add("i"); al.add("a"); al.add(null); } }
Feb 01 2004
next sibling parent reply "Ivan Senji" <ivan.senji public.srce.hr> writes:
I had the exact same problem with a class "set" i tried to write!

i had

class set(T)
{
...
    void add(set!(T) a)
    {
    }
    //this is the member function that causes compiler error!

}
Feb 01 2004
parent Ilya Zaitsev <sark7 mail333.com> writes:
On Sun, 1 Feb 2004 20:35:20 +0100, Ivan Senji <ivan.senji public.srce.hr> 
wrote:

 I had the exact same problem with a class "set" i tried to write!

 i had

 class set(T)
 {
 ...
     void add(set!(T) a)
     {
     }
     //this is the member function that causes compiler error!

 }

But this works: template TSet(T) { class Set { void add(TSet!(T).Set item) { } } } int main() { TSet!(int).Set set = new TSet!(int).Set(); set.add(set); return 0; } I think, it's a bug in templates with a new style syntax.
Feb 01 2004
prev sibling parent "Walter" <newshound digitalmars.com> writes:
The trouble you're having is that class templates declare two symbols, a
template symbol and its associated class symbol. Both have the same name.
Inside the scope of the class template instantiation, using the class
template name resolves to the class symbol, not the template symbol. Thus,
replacing:

public boolean addAll(MyArrayList!(T) c)

with:

public boolean addAll(MyArrayList c)

should resolve it. If you want to use the template symbol, add the module
scope '.' operator in front:

public boolean addAll(.MyArrayList!(T) c)

"Andres Rodriguez" <rodriguez ai.sri.com> wrote in message
news:bvjbal$4t6$1 digitaldaemon.com...
 Here is a minimalist ArrayList implementation using templates.  Everything
 compiles fine, until I throw the second test file in the mix.

 I tried using the same syntax from the Christopher E. Miller example of a
 linked
 list.

 The trouble seems to be the method 'addAll', because if I comment it out,
 eveything
 compiles.  But the weird thing is that MyArrayList compiles fine without

 test
 file at the end, is only after adding that file that I get the compilation
 error.

 I get the following error:

 cd c:/dev/d/util/src/sri/util/test/
 make -k -f c:/dev/d/util/Makefile compile
 \dmd\bin\dmd -c -od\dev\d\util\bin -I\dev\d\util\src -release

 \dmd\bin\dmd -c -od\dev\d\util\bin -I\dev\d\util\src -release

 template instance MyArrayList!(char[]) MyArrayList is not a template

 make: *** [sri-util-test] Error 1
 make: Target `compile' not remade because of errors.

 Compilation exited abnormally with code 2 at Sun Feb 01 08:40:29

Thanks in advance, Andres ***** File MyArrayList ******************************************************* module java.util.MyArrayList; public class MyArrayList(T) { //~ ATTRIBUTE(S) --------------------------------------------------------- private int length = 0; private T[] data; //~ CONSTRUCTOR(S) ------------------------------------------------------- public this() { } public this(MyArrayList!(T) c) { addAll(c); } public this(int initialCapacity) { data.length = initialCapacity; } //~ METHOD(S) ------------------------------------------------------------ public boolean add(T o) { ensureCapacity(length+1); data[length++] = o; return true; } public void add(int index, T element) { ensureCapacity(length+1); for (int i = length - 1; i > index; i--) data[i] = data[i-1]; data[index] = element; } public boolean addAll(MyArrayList!(T) c) { boolean modified = false; for (int i = 0; i < c.length; i++) { if (add(c.get(i))) modified = true; } return modified; } public void clear() { data.length = 0; } public boolean contains(T o) { for (int i = 0; i < length; i++) if (o == data[i]) return true; return false; } public void ensureCapacity(int minCapacity) { if (minCapacity > data.length) data.length = (data.length == 0? 10

 2 * data.length);
     }

     public T get(int index) { return data[index]; }

     public boolean isEmpty() { return length == 0; }

     public T remove(int index) {
         T o = data[index];
         length--;
         for (int i = index; i < length; i++) data[i] = data[i+1];
         return o;
     }

     public boolean remove(T o) {
         int lag = 0;
         for (int i = 0; i < length - lag; i++) {
             if (o == data[i]) lag++;
             if (lag > 0) data[i] = data[i+lag];
         }
         length -= lag;
         return lag > 0;
     }

     public T set(int index, T element) { return data[index] = element; }

     public int size() { return length; }
 }


 ***** File TestMyArrayList
 ***************************************************

 module sri.util.test.TestMyArrayList;

 import sri.util.MyArrayList;


 public class TestMyArrayList {

     protected void buildArrayList() {
         MyArrayList!(char[]) al = new MyArrayList!(char[]);
         al.add("a");
         al.add("c");
         al.add("u");
         al.add("n");
         al.add("i");
         al.add("a");
         al.add(null);
     }
 }

Jun 06 2004