cannot cast

Namespace rswhite4 at googlemail.com
Sat Apr 28 09:00:36 PDT 2012


On Saturday, 28 April 2012 at 14:21:32 UTC, Namespace wrote:
> I finished my Ref/NotNull struct, but i've got a problem:
> If i try to cast the class, which should implicit convert to 
> Ref!(Type) with alias this, i get the following error message:
> "cannot cast a1.getRef("Ref.d",72u) of type Ref!(A) to type 
> RefTest.Ref.__unittest1.B"
>
> Can someone explain that to me or help me with it?
> It seems that alias this replacement isn't smart enough to 
> distinguish, if it has to convert.
>
> [code]
> import std.conv : to;
>
> struct Ref(T : Object) {
> private:
> 	 T _obj;
>
> public:
> 	@disable
> 	this();// { }
>
> 	@disable
> 	this(typeof(null));// { }
>
> 	this(T obj) {
> 		assert(obj !is null, "Object is null!");
>
> 		this._obj = obj;
> 	}
>
> 	@property
> 	inout(T) access() inout {
> 		assert(this._obj !is null, "Access: Object is null!");
>
> 		return this._obj;
> 	}
>
> 	//alias access this; // print "Stackoverflow" or "recursive 
> expansion"
> }
>
> mixin template TRef(T : Object) {
> 	final Ref!(T) getRef(string file = __FILE__, size_t line = 
> __LINE__) in {
> 		assert(this !is null, "Object is null! @ " ~ file ~ " in Line 
> " ~ to!(string)(line) ~ ".");
> 	} body {
> 		return Ref!(T)(this);
> 	}
> 	
> 	final Ref!(const T) getRef(string file = __FILE__, size_t line 
> = __LINE__) const in {
> 		assert(this !is null, "Object is null! @ " ~ file ~ " in Line 
> " ~ to!(string)(line) ~ ".");
> 	} body {
> 		return Ref!(const T)(this);
> 	}
>
> 	alias getRef this;
> }
>
> unittest {
>
> 	class A {
> 		mixin TRef!(A);
> 	}
>
> 	class B : A { }
>
> 	class C : B { }
>
> 	A a1 = new B();
> 	A a2 = new C();
>
> 	B b1 = cast(B) a1; // line 72
> }

Trying to fix it with an opCast in Ref ended in an infinity 
loop...



More information about the Digitalmars-d-learn mailing list