2014-03-13 4 views
3

Здесь я хочу Lockstep итерацию по двум массивам size_tDMD не может вывести тип, даже если тип задается

import std.stdio; 
import std.range; 
import std.exception; 
import std.conv; 

struct zip(R,Q) 
if(isInputRange!(R) && isInputRange!(Q)) 
{ 
    R r; 
    Q q; 
    @property 
    const auto front() { 
     return tuple(r.front, q.front); 
    } 
    void popFront() { 
     r.popFront(); 
     q.popFront(); 
    } 
    @property 
    const bool empty() { 
     bool re = r.empty; 
     enforce(re == q.empty); 
     return re; 
    } 
} 

void main() { 
    size_t[] a = [0,1,2,3,4,5]; 
    size_t[] b = [2,3,4,5,6,7]; 
    foreach(size_t i, size_t j; zip!(size_t[],size_t[])(a,b)) { 
     writeln(to!string(i) ~ " " ~ to!string(j)); 
    } 
} 

Но это не удается скомпилировать с

src/Interpreter.d(30): Error: cannot infer argument types 

Однако, когда я изменить Еогеасп линия использовать UINT вместо size_t (я на 32-битном ноутбук)

foreach(uint i, uint j; zip!(size_t[],size_t[])(a,b)) { 

Он собирает и работает нормально. Что происходит?

ответ

3

Возможно, это ошибка. В версии 2.05.0 он не работает, но он работает в последней версии разработки git-head.

+0

Я довольно новичок в D. Я слышал об этом раньше, и я думаю, что поставил вопрос о StackOverflow о настройке, но я отказался от него. Затем я, наконец, просто взял книгу на ней на прошлой неделе, и это первое, что я написал, которое использует шаблоны. Шаблоны D обычно еще не стабильны? Или мне просто не повезло? – dspyz

+0

Это сработало. Думаю, мне придется использовать версию dev с этого момента. Благодаря! – dspyz

+1

Я думаю, что вам удастся немного испортиться, в большинстве случаев, когда foreach (size_t a, something else; item), вы хотите, чтобы он был индексом в массиве. Чтобы вы хотели, чтобы size_t был членом кортежа, он, вероятно, путал компилятор. Была и некоторая недавняя работа над этой областью, потому что индексирование диапазонов в foreach использовалось, чтобы не работать без немного большего количества кода, и это совсем недавно стало фиксированным. –

Смежные вопросы