C++ template copy constructor on template class

前端 未结 3 642
半阙折子戏
半阙折子戏 2020-11-29 13:13

I have a template class that has a template copy constructor. The problem is when I instantiate this class using another instance of this class with the same template type,

相关标签:
3条回答
  • 2020-11-29 13:42

    I think REACHUS is right. The compiler is generating a default copy-constructor (as it would with a non-template class too) and preferring this over your template as it's more specialised.

    You should make your "normal" copy-constructor private, or better, use the C++11 'deleted' keyword to mark the function as unusable.

    However, this doesn't compile. Sorry, I wasn't able to test it at the time.

    0 讨论(0)
  • 2020-11-29 13:53

    A copy constructor is of the form X(X& ) or (X const&) and will be provided for you by the compiler if you didn't declare one yourself (or a few other conditions which are not relevant here). You didn't, so implicitly we have the following set of candidates:

    MyTemplateClass(const MyTemplateClass&);
    template <typename U> MyTemplateClass(const MyTemplateClass<U>&);
    

    Both are viable for

    MyTemplateClass<int> instance2(instance);
    

    Both take the same exact arguments. The issue isn't that your copy constructor template doesn't match. The issue is that the implicit copy constructor is not a function template, and non-templates are preferred to template specializations when it comes to overload resolution. From [over.match.best], omitting the unrelated bullet points:

    Given these definitions, a viable function F1 is defined to be a better function than another viable function F2 if for all arguments i, ICSi(F1) is not a worse conversion sequence than ICSi(F2), and then
    — [...]
    — F1 is not a function template specialization and F2 is a function template specialization, or, if not that,
    — [...]

    That's why it calls your implicit (and then, your explicit) copy constructor over your constructor template.

    0 讨论(0)
  • 2020-11-29 13:53

    When you do not have a copy constructor in you code, the compiler will implicitly generate it. Therefore when this line is executed:

    MyTemplateClass<int> instance2(instance);
    

    A copy constructor is being executed, though obviously not yours. I think that templating has nothing to do with it.

    Read more about it here: Implicitly-defined copy constructor

    0 讨论(0)
提交回复
热议问题