В вашем коде есть пара неправильных вещей, о которых вы могли не знать.
List<int> kk( List<int> );
Эта строка не является определением переменной, а скорее объявлением функции, которая принимает List<int>
в качестве аргумента и возвращает List<int>
, так что фактически не будет вызываться никакой конструктор.Это называется most-vexing-parse (вы можете посмотреть его различные версии, выполнив поиск в SO или в разделе C ++ FAQ )
Вторая проблема заключается в том, что вы не можете создать ни один экземпляр экземпляра типа List
, причина в том, что единственный предоставляемый вами конструктор - это шаблонный конструктор, который принимает в качестве аргумента второй List<U>
.Это фактически отключает конструктор по умолчанию, поэтому единственный способ создать List<T>
- это уже иметь List<U>
, а это невозможно.Вы можете добавить конструктор по умолчанию обратно:
template <typename T>
class List {
public:
List() {}
template <typename U>
List( List<U> const & ) {} // prefer const& as that will avoid unnecessary copying
};
И теперь вы можете написать:
List<int> l = List<int>(); // this will call List<int>::List( List<int> const & )
И, тем не менее, он по-прежнему не будет вызывать нужный вам конструктор.Причина немного неясна, но когда копирует конструирование элемента шаблона, компилятор не использует шаблонный конструктор.В приведенном выше коде он будет неявно определять конструктор копирования, выполняя для всех членов конструктор копирования методов и вызывая этот сгенерированный конструктор.Это означает, что в большинстве случаев, когда вы хотите предоставить шаблонный конструктор, вы также хотите предоставить не шаблонный конструктор копирования.
Чтобы вызвать этот конструктор, вам нужно будет предоставить другой тип:
List<int> l = List<double>();
Поскольку типы на самом деле различаются, компилятор не может скопировать конструкцию , обнаружит, что предоставленный шаблонный конструктор является лучшим кандидатом на перегрузку, и вызовет его.