Issue with std.typecons.scoped and Interfaces

kenji hara k.hara.pg at gmail.com
Tue Aug 16 00:34:48 PDT 2011


I think this is trivial problem.

https://github.com/D-Programming-Language/phobos/pull/199

The head of BaseClass tuple is exact super class, and we should get it.

Kenji Hara

2011/8/16 Andrew Wiley <wiley.andrew.j at gmail.com>:
> Sorry this is long, but it's a somewhat complicated issue that I think
> someone who knows a lot about is() could solve very quickly. I hit this a
> while back but didn't figure out exactly what the issue was until today. It
> seems that std.typecons.scoped doesn't play nice with interfaces:
> scopedtest.d (shortened somewhat):
> import std.typecons, std.stdio;
> class A {
> this() { writeln("A"); }
> ~this() { writeln("~A"); }
> }
> interface Bob {}
> class ABob : A, Bob {
> this() { writeln("ABob"); }
> ~this() { writeln("~ABob"); }
> }
> void main() { auto abob = scoped!ABob(); }
>
> compiler output:
> $ gdc -o scopedtest scopedtest.d
> /usr/include/d2/4.6.0/std/typecons.d:2571: Error: template
> std.typecons.destroy(T) if (is(T == class)) does not match any function
> template declaration
> /usr/include/d2/4.6.0/std/typecons.d:2571: Error: template
> std.typecons.destroy(T) if (is(T == class)) cannot deduce template function
> from argument types !()(A,Bob)
> /usr/include/d2/4.6.0/std/typecons.d:2530: Error: template instance
> std.typecons.destroy!(ABob) error instantiating
> scopedtest.d:18:        instantiated from here: scoped!(ABob,)
> scopedtest.d:18: Error: template instance std.typecons.scoped!(ABob,) error
> instantiating
>
> std.typecons.destroy:
> /*
>   Used by scoped() above.  Calls the destructors of an object
>   transitively up the inheritance path, but work properly only if the
>   static type of the object (T) is known.
>  */
> private void destroy(T)(T obj) if (is(T == class))
> {
>     static if (is(typeof(obj.__dtor())))
>     {
>         obj.__dtor();
>     }
>     static if (!is(T == Object) && is(T Base == super))
>     {
>         Base b = obj;
>         destroy(b); // <-- this instantiation is failing
>     }
> }
>
> So it looks like instead of a single type, we're getting a tuple of some
> sort because ABob has multiple "superclasses" ? I haven't played with tuples
> enough to know exactly what's going on here.


More information about the Digitalmars-d mailing list