Разные типы, когда один и тот же аргумент шаблона? - PullRequest
4 голосов
/ 13 декабря 2011
struct Matrix(T, size_t row, size_t col){

  alias row Row;
  alias col Col;

  auto opBinary(string op, M)(in M m) const if(op == "*"){
    static assert(Col == M.Row, "Cannot Mix Matrices Of Different Sizes.");
    // whatever...
    return Matrix!(T, Row, M.Col)();
  }
}


void main(){


  Matrix!(double, 2, 3) m1 = Matrix!(double, 2, 3)();
  Matrix!(double, 3, 2) m2 = Matrix!(double, 3, 2)();
  Matrix!(double, 2, 2) m3 = m1 * m2;  // ERROR
// Error: cannot implicitly convert expression (m1.opBinary(m2)) of type Matrix!(double,row,col) to Matrix!(double,2,2)
}

Почему ошибка и как я могу решить эту проблему?

1 Ответ

5 голосов
/ 13 декабря 2011

Проблема в том, что в настоящее время шаблоны создаются с их аргументами типами, а не с их параметрами типами.

Если вы изменили свой оператор возврата на:

return Matrix!(T, cast(int)Row, cast(int)M.Col)();

Он скомпилируется, потому что он был создан с int, а не size_t (который является uint или ulong).

Это давняя ошибка, и хотя он ранеене понравилось, Уолтер недавно передумал , поддерживая изменение этого параметра для использования типов параметров. Здесь - это запрос на удаление, исправляющий эту проблему (он будет в следующем выпуске DMD), связывающий различные связанные ошибки.

...