C ++ и Java имеют это сходство в том, как они обрабатывают параметрический полиморфизм: оба будут выводить параметры типа для обычных функций или методов, но требуют от программиста явного указания параметров типа при вызове конструктора (хотя это было изменено в Java 7).
Какова техническая причина такого поведения?
редактироватьЯ ошибочно думал, что это относится и к Scala.
Вот пример из Java:
class Foo<T> {
Foo(T x) { }
}
<T> void foo(T x) { }Foo<Integer> f = new Foo(3);
foo(3);
оба они являются законными, но первый создает «сырой тип», а не Foo<Integer>
и выполняет непроверенное назначение.
Это потому, что шаблоны C ++ могут быть специализированными.
Это означает, что только потому, что есть основное определение:
template<typename T>
class Foo
{
Foo(T x) { }
};
и ясно int
будет принят Foo<int>(int)
вполне возможно, что есть также специальное определение
template<>
class Foo<Foobar>
{
Foo(int x) { }
};
который также принимает int
параметр.
Добавьте пользовательские преобразования типов в смесь, и вы увидите, что просто невозможно определить параметры типа класса из аргументов функции.
И фактически вывод параметров типа для конструкторов разрешен. Но не вывод параметров шаблона класса. Например, разрешить неявный upcast при создании умного указателя:
template<typename T>
class a_smart_ptr
{
template<typename TOther>
a_smart_ptr(TOther* p) { }
};
Других решений пока нет …