"Cannot infer argument types" for foreach over byLine

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Jan 24 00:44:44 PST 2015


On 01/24/2015 12:14 AM, Meta wrote:

 > import std.stdio;
 >
 > void main()
 > {
 >      foreach (i, line; file.byLine())

Unless the range itself provides explicitly, automatic counter is 
available only for arrays. Otherwise, you have to enumerate yourself. ;)

import std.stdio;
import std.range;

void main()
{
     foreach (i, element; iota(42, 45).enumerate) {
         writefln("%s: %s", i, element);
     }
}

I am not sure whether std.range.enumerate is available in the current 
compiler. If not, you can use zip and sequence:

     foreach (i, element; zip(sequence!"n", iota(42, 45))) {
         writefln("%s: %s", i, element);
     }

However, that code is taking advantage of automatic tuple expansion, 
which causes trouble in some cases but not here. If you don't want that, 
you can expand the tuple explicitly:

     foreach (t; zip(sequence!"n", iota(42, 45))) {
         writefln("%s: %s", t[0], t[1]);
     }

 >      {
 >          writeln(line);
 >      }
 > }
 >
 > This code gives me the error:
 >
 > Error: cannot infer argument types, expected 1 argument, not 2
 >
 > This is a very obtuse compiler message considering how simple the code
 > is; I know it's got something to do with the foreach statement and what
 > byLine() returns, but I can't seem to get it to compile without removing
 > `i`.

Ali



More information about the Digitalmars-d-learn mailing list