2013-10-03 18 views
14

Przeczytałem, że szablon copy-con nigdy nie jest domyślną kopią onstructor, a szablon przypisania-op nigdy nie jest operatorem przypisania kopii.Kopiuj konstruktor szablonu klasy

nie mogłem zrozumieć, dlaczego takie ograniczenie jest potrzebne i od razu poszedł online ideone i zwracają test program ale tutaj skopiować konstruktor nigdy nie jest wywoływana na dalsze googlowania natknąłem templatized konstruktora i próbowałem tego, ale jeszcze nigdy nie domaga skopiować konstruktora .

#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; 
} 

Może ktoś wyjaśnić mi całą powodem wprowadzenia tego ograniczenia, a także jak napisać konstruktor kopiujący klasy szablonu.

Dzięki

+2

[Copy-elision.] (Http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) – 0x499602D2

+1

Nie ma "domyślnego konstruktora kopii". Jest tylko * jeden * konstruktor kopiowania. Szablon nigdy nim nie jest. –

+0

Edytowałem kod i uruchomiłem go w idee, ale wciąż kopiuję konstruktora, nie otrzymuję wywołania. ale nie jestem w stanie zrozumieć przyczyny tego ograniczenia. – anonymous

Odpowiedz

18

Istnieją ścisłe zasady co stanowi konstruktor kopiujący (por C++ 11, 12.8):

  • To nie jest szablon.

  • Dla klasy T, jej pierwszy argument musi mieć typ T & lub T const & lub T volatile & lub T const volatile &.

  • Jeśli ma więcej niż jeden argument, dalsze argumenty muszą mieć wartości domyślne.

Jeśli nie zadeklarować konstruktor kopiujący, konstruktor kopię formularza T::T(T const &) jest niejawnie zadeklarowana dla Ciebie. (To może, ale nie musi być zdefiniowane, a jeśli jest zdefiniowane, to może być zdefiniowane jako usunięte.)

(Standardowe reguły dotyczące przeciążania oznaczają, że możesz mieć maksymalnie czterech konstruktorów kopii, po jednym dla każdej kwalifikacji CV .)

Istnieją analogiczne reguły dla konstruktorów ruchu, z && w miejsce &.

17

nie mogę wypowiedzieć się na temat, dlaczego tak jest, jak to jest, ale tutaj jest jak piszesz konstruktor kopiujący i operator przypisania dla szablonu Klasa:

template <class T> 
    class A 
    { 
     public: 
     A(const A &){} 
     A & operator=(const A& a){return *this;} 
    }; 

i to wszystko.
Podejście polega na tym, że nawet jeśli A jest szablonem, jeśli odwołasz się do niego w klasie jako A (na przykład w podpisach funkcji), jest on traktowany jako pełny typ A<T>.

+1

Zauważyłem, że używanie A (const A &) {} nie powoduje żadnego błędu ... – Daniel

+4

@Daniel To dlatego, że 'A ' odnosi się także do pełnego typu klasy, 'A' jest skrótem, którego możesz użyć w klasie. – SirGuy

+0

@NicolaiNita Czy to nie jest to, co mówi pierwszy komentarz? – SirGuy

Powiązane problemy