Копировать конструктор класса шаблона
Я прочитал, что шаблон copy-con шаблона никогда не является экземпляром по умолчанию для onstructor, а назначение шаблона-op никогда не является оператором присваивания копии.
Я не мог понять, почему это ограничение необходимо, и сразу же отправился в интернет в ideone и возвратил тестовую программу, но здесь создатель копирования никогда не получает призвал к дальнейшему поиску googling. Я столкнулся с темплатированным конструктором и попробовал это, но все же он никогда не вызывает конструктор копирования.
#include <iostream>
using namespace std;
template <typename T> class tt
{
public :
tt()
{
std::cout << std::endl << " CONSTRUCTOR" << std::endl;
}
template <typename U> const tt<T>& operator=(const tt<U>& that){std::cout << std::endl << " OPERATOR" << std::endl;}
template <typename U> tt(const tt<U>& that)
{
std::cout << std::endl << " COPY CONSTRUCTOR" << std::endl;
}
};
tt<int> test(void)
{
std::cout << std::endl << " INSIDE " << std::endl; tt<int> a; return a;
}
int main() {
// your code goes here
tt<int> a ; a = test();
return 0;
}
Может ли кто-нибудь объяснить мне всю причину этого ограничения, а также как написать конструктор экземпляра класса шаблона.
Спасибо
Ответы
Ответ 1
Существуют строгие правила, которые составляют конструктор копирования (см. С++ 11, 12.8):
-
Это не шаблон.
-
Для класса T
его первый аргумент должен иметь тип T &
или T const &
или T volatile &
или T const volatile &
.
-
Если у него есть несколько аргументов, дополнительные аргументы должны иметь значения по умолчанию.
Если вы не объявляете конструктор копии, конструктор копирования формы T::T(T const &)
неявно объявлен для вас. (Он может или не может быть определен, и если он определен, он может быть определен как удаленный.)
(Обычные правила разрешения перегрузки подразумевают, что у вас может быть не более четырех конструкторов копирования, по одному для каждой CV-квалификации).
Существуют аналогичные правила для конструкторов перемещения, причем &&
вместо &
.
Ответ 2
Я не могу прокомментировать, почему так оно и есть, но вот как вы пишете конструктор копирования и оператор присваивания для шаблона класса:
template <class T>
class A
{
public:
A(const A &){}
A & operator=(const A& a){return *this;}
};
и что это.
Трюк здесь заключается в том, что даже если A
является шаблоном, когда вы ссылаетесь на него внутри класса как A
(например, в сигнатурах функций), он рассматривается как полный тип A<T>
.