Szablon nie może być konstruktor kopia. §12.8/2, przypis:
Because a template constructor is never a copy constructor, the presence of such a template does not suppress the implicit declaration of a copy constructor. Template constructors participate in overload resolution with other constructors, including copy constructors, and a template constructor may be used to copy an object if it provides a better match than other constructors.
Od argumentem szablonu jest const &
, jego podpis będzie dokładnie taki sam, jak w sposób dorozumiany-zadeklarowanej funkcji w przypadku kopiowania, więc nigdy nie będzie używany jako konstruktor kopii.
To może być OK, ponieważ w tym przykładzie używasz go jako konstruktora konwersji . Jednak argumenty szablonu przed ::
są kontekstem niewydechem, więc kompilator nie może podłączyć A<int>::B
i rozwiązać int
. Ze względu na różne sposoby specjalizowania szablonów, kompilator nie może ustalić, który z nich kwalifikuje się do tego, który z A
. Możesz dodać typedef A<int>::B B;
wewnątrz A<float>
, a następnie oba int
i float
będą kwalifikować się jako U
.
Można to naprawić, używając SFINAE i dodając typy elementów do klas, aby ułatwić nawigację w hierarchii. Oto demo.
#include <typeinfo>
#include <iostream>
template<typename T>
struct A
{
typedef T type;
struct B
{
B() {}
template<typename U>
B(const U& rhs, typename U::nest_A_parent * = NULL) {
std::cout << "copied from type "
<< typeid(typename U::nest_A_parent::type).name() << '\n';
}
private:
typedef A nest_A_parent;
template< typename U >
friend struct B;
};
};
int main()
{
A<int>::B x;
A<double>::B y(x);
}
Dla wyjaśnienia, jaka jest pożądana konwersja? Ponieważ nie konwertujesz int do double, ale A :: B na A :: B, który jest klasą dla innej klasy. –
SSight3
@ SSight3: Pozwól mi zgadnąć, że Robert próbuje ponownie wprowadzić inteligentne wskaźniki z zewnętrznymi wartościami reflag i polimorficznymi przypisaniami ... – sehe
Konwersja jest z A :: B do A :: B dla dowolnego T, U. int i double to tylko przykłady, których użyłem. I nie, to nie to robię. –