Hi,

I have the following code which should compile in my opinion:

struct Foo {}

import std.range.primitives;
import std.algorithm.iteration : map, joiner;

auto toChars(R)(R r) if (isInputRange!R)
{
   return r.map!(toChars).joiner(", ");
}

auto toChars(Foo f)
{
   import std.range : chain;
   return chain("foo", "bar");
}

void main()
{
   import std.range : repeat;
   Foo f;
   auto r = f.repeat(3);
   auto chars = r.toChars();
}

But fails to compile with the following error:

Error: template instance std.algorithm.iteration.MapResult!(toChars, Take!(Repeat!(Foo))) forward reference of function toChars

The reason it fails to compile in my opinion is that the template constraint fails to remove the generic toChars from the list possible matches early enough so the compiler thinks there is a recursive call and cannot deduce the return type.

Just changing the name of the generic toChars to anything else makes the code compile:

struct Foo {}

import std.range.primitives;
import std.algorithm.iteration : map, joiner;

auto toCharsRange(R)(R r) if (isInputRange!R)
{
   return r.map!(toChars).joiner(", ");
}

auto toChars(Foo f)
{
   import std.range : chain;
   return chain("foo", "bar");
}

void main()
{
   import std.range : repeat;
   Foo f;
   auto r = f.repeat(3);
   auto chars = r.toCharsRange();
}

Compiles just fine.



Reply via email to