Копировать конструктор класса шаблона

Я прочитал, что шаблон 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>.