Ideas how to improve template constraint errors

Martin Nowak code at dawg.eu
Thu Dec 5 05:53:24 PST 2013


I'm sitting here trying to figure out why I can't combine join 
pathSplitter components with pathSeparator.

import std.range, std.path;

void bug()
{
     auto comps = pathSplitter("foo/bar");
     auto path = join(comps, pathSeparator);
}

This is the error message:

path.d(6): Error: template std.array.join does not match any function 
template declaration. Candidates are:
DPL/dmd/src/../../phobos/std/array.d(1559):        std.array.join(RoR, 
R)(RoR ror, R sep) if (isInputRange!RoR && 
isInputRange!(ElementType!RoR) && isInputRange!R && 
is(Unqual!(ElementType!(ElementType!RoR)) == Unqual!(ElementType!R)))
DPL/dmd/src/../../phobos/std/array.d(1606): 
std.array.join(RoR)(RoR ror) if (isInputRange!RoR && 
isInputRange!(ElementType!RoR))
path.d(6): Error: template std.array.join(RoR, R)(RoR ror, R sep) if 
(isInputRange!RoR && isInputRange!(ElementType!RoR) && isInputRange!R && 
is(Unqual!(ElementType!(ElementType!RoR)) == Unqual!(ElementType!R))) 
cannot deduce template function from argument types !()(PathSplitter, 
string)

This is what I currently have to do to figure out what is going on.

     // declare types of arguments
     alias RoR = typeof(comps);
     alias R = typeof(pathSeparator);
     // static assert each constraint
     static assert(isInputRange!RoR);
     // Bingo!
     static assert(isInputRange!(ElementType!RoR));
     // path.d(9): Error: static assert  (isInputRange!(const(char[]))) 
is false
     static assert(isInputRange!R);
     static assert(is(Unqual!(ElementType!(ElementType!RoR)) == 
Unqual!(ElementType!R)));

A useful error message should be something along this line.

path.d(6): Error: Can't call template function 'join' because the 
element type of 'comps' is not an input range.

path.d(6): Error: Can't call template function 'join' because the 
following constraint failed.
     isInputRange!(ElementType!RoR), RoR == const(char[]) deduced from 
argument 'comps'.


More information about the Digitalmars-d mailing list