2015-08-15 1 views
2

Я получаю эту ошибку: Error: mismatched function return type inference of, когда возвращаю различные типы InputRanges из одной и той же функции. Тип, возвращаемый take или takeExactly, по какой-то причине совместим с исходным диапазоном ввода, но не совместим с моим пользовательским диапазоном ввода.Функция возвращаемого типа явление несоответствия при возврате разных диапазонов ввода

auto decode(Range)(Range r) { 
    if (r.front == 0) {   
    r.popFront(); 
    return r; 
    } else if (r.front == 1) { 
    r.popFront(); 
    return r.take(3); // this is compatible with the return type above 
    } else if (r.front == 2) { 
    r.popFront(); 
    return MyRange(r); // this is not compatible with the types above 
    } 
} 

Что происходит?

+1

Есть ли у 'MyRange' разрезы (' opSlice')? – sigod

+0

Да, у него есть нарезка. – Tamas

+0

Так что практически это ответ: r и r.take (3) имеет тот же тип, если разрезание диапазона поддерживается, и оно отличается от MyRange (r). Благодаря!! – Tamas

ответ

3

template Take(R) ничего не изменит к ошибке сообщения, которую вы получаете от компилятора. Проблема заключается в том, что тип возвращаемого значения зависит от функции, которая работает только во время выполнения.

Различные типы возврата могут быть выведены только во время компиляции, но в этом случае значение r.front не будет известно.

Для упрощения здесь пример, который избавляется от диапазонов и воспроизводит проблему

// t can be tested at compile-time, fun is a template 
auto fun(int t)() 
{ 
    static if (t == 0) return "can be inferred"; 
    else return new Object; 
} 

// t cant be tested at compile-time and this produces your error: 
// Error: mismatched function return type inference of typethis and that 
auto notfun(int t) 
{ 
    if (t == 0) return "cant be inferred"; 
    else return new Object; 
} 

void main(string[] args) 
{ 
    import std.stdio; 
    fun!0().writeln; // works, returns a string 
    fun!1().writeln; // works, returns an int 
} 

Наконец, что у вас есть два варианта:

  • найти общий тип
  • тест r.front из функции и вызывать разную перегрузку в соответствии со значением.
+0

Спасибо, я избавился от части псевдонима вопроса. Это то, что вы говорите, имеет смысл, но не объясняет, почему «return r;» и «return r.take (3)» работают в одной и той же функции. Это объясняется тем, что сказал sigoit: это диапазон, который поддерживает нарезку, поэтому он является одним и тем же типом. – Tamas

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