2013-09-06 5 views
1

я следующий класс в файле myclass.hpp:конструктор копирования не вызывается в шаблонного класса

#ifndef MYCLASS_HPP 
#define MYCLASS_HPP 
#include <cstdlib> 
#include <iostream> 
template <std::size_t l, typename T> 
class MyClass { 
public: 
    MyClass(); 
    MyClass(const MyClass<l,T>& other); 
}; 
#include "myclass.tpp" 
#endif 

И файл реализации псевдо myclass.tpp:

template <std::size_t l, typename T> 
MyClass<l,T>::MyCLass() { 
    std::cout << "Ctor" << std::endl; 
} 
template <std::size_t l, typename T> 
MyClass<l,T>::MyCLass(const MyCLass<l,T>& other) { 
    std::cout << "COPY Ctor" << std::endl; 
} 

В моем главном файле у меня есть:

#include "myclass.hpp" 
int main(int argc, char** argv) { 
    MyCLass<10,int> m1; 
    MyClass<10,int> m2; 
    m1 = m2; // <-- HERE 
} 

Конструктор копирования не вызывается. Отпечаток следующее:

CTOR

CTOR

Что я делаю неправильно? Thankyou

+0

Это не должно быть названо. Попробуйте определить оператор присваивания и посмотрите, что произойдет. – lapk

ответ

2

Потому что вы не вызвать конструктор копирования, вы вызываете оператор присваивания копии. Конструктор вызова экземпляр будет:

MyClass<10,int> m2(m1); 

Функция вы вызываете имеет подпись:

template <std::size_t l, typename T> 
MyClass<l, T>& operator=(const MyClass<l, T>& other); 
1

Вместо этого вызывается implicitly defined assignment operator. Он выполняет назначение по порядку (то есть фактически ничего в этом случае), и поэтому не вызывается copy-ctor. Попробуйте вместо этого:

MyCLass<10,int> m1; 
MyClass<10,int> m2 = m1; 
+0

Да, вы правы !!! Он работает сейчас, и это также вполне логично, что происходит ... – Andry

Смежные вопросы