On 03/08/2011 06:56 PM, Andrej Mitrovic wrote:
module test;
struct MyArray(T)
{
private T[] data;
bool opCast(T)() if (is(T == bool))
{
return !data.empty;
}
}
void main()
{
auto foo = MyArray!(int)();
auto state = foo ? true : false;
}
test.d(13): Error: undefined identifier module test.empty
test.d(20): Error: template instance test.MyArray!(int).MyArray.opCast!(bool)
error instantiating
This is straight from the book. Did .empty exist for arrays before? Perhaps
this was just a typo in the book, and it was supposed to be:
bool opCast(T)() if (is(T == bool))
{
return data.length != 0;
}
Also, that error message *really* needs to improve. It's not module 'test'
which is missing the method, it's 'data'. This is one of the most confusing
error messages that I know of and it pops up all the time.
Agreed. But do you understand why dmd throws that error, anyway? I'm not sure,
the following may be plain shit. My guess is, since "UFCS" (universal function
call syntax) exists for arrays, when dmd decodes "data.empty" and does not find
any "empty" slot on 'data' or on its type, it tries rewriting it into
"empty(data)". Right? then, to execute that, it looks for an "empty" func in
the module, which it does not find... thus the message.
Note that if one of your imports happened to hold an "empty" func, either it
would execute by plain chance, or you would get a type error!
HTH
Denis
--
_________________
vita es estrany
spir.wikidot.com