Баг компилятора в шаблоне: template parameter ambiguous

 

Билд 1966, 64 бит.   В данном примере компилятор выдаёт ошибку о неоднозначности, хотя тут всё однозначно, ведь массив long[] не может преобразовываться в int[].

template<typename T>
void f(T&[], T) {  }

void OnInit()
{ 
  long arr[];
  int a;
  f(arr, a); // template parameter ambiguous, could be 'long' or 'int'
}

p.s.  Я ошибся. Ложная тревога.

 
Нужно писать в комитет, пусть раздвигают стандарты.
 
Индексация массивов в любом случае ограничена 2147483647, объявите второй параметр как int и не будет никакой неоднозначности...
 
Alexey Navoykov:

Билд 1966, 64 бит.   В данном примере компилятор выдаёт ошибку о неоднозначности, хотя тут всё однозначно, ведь массив long[] не может преобразовываться в int[].

ошибка справедлива. подстановка не учитывает преобразования и не должна. так что у шаблона на выбор два равнозначных варианта подстановки.

 
template<typename T, typename T1>
void f(T &data[], T1 val) {  }

void OnInit()
{ 
  long arr[];
  int a;
  f(arr, a); // template parameter ambiguous, could be 'long' or 'int'
}

или

template<typename T>
void f(T &data[], T val) {  }

void OnInit()
{ 
  long arr[];
  long a;
  f(arr, a); // template parameter ambiguous, could be 'long' or 'int'
}
 
Тут проблема в том, что long[] и long не считаются разными типами (не говоря уже о long[][] и т.п.). Поэтому компилятор "не знает", что это массив и что он не приводится.
 

Да, похоже я ошибся, TheExpert оказался прав.  C++ тоже ошибку выдаёт в аналогичной ситуации.

 
Alexey Navoykov:
Да, похоже я ошибся, TheExpert был прав.  В C++ тоже ошибку выдаёт в аналогичной ситуации.

TheExpert всегда прав. В редких случаях общения с Integer возможны исключения. 

 
Алексей Тарабанов:

TheExpert всегда прав. В редких случаях общения с Integer возможны исключения. 

Судья Дред)

 
Ilya Malev:
Тут проблема в том, что long[] и long не считаются разными типами (не говоря уже о long[][] и т.п.). Поэтому компилятор "не знает", что это массив и что он не приводится.

Набросайте схему приведения типов и народ к Вам потянется. Главное помнить: сначала прямое преобразование, после - обратное, если оно возможно. 

 
Vitaly Muzichenko:

Судья Дред)

Не переживай так. 

Причина обращения: