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
}

不调用复制构造函数。打印输出如下:

克托尔

克托尔

我究竟做错了什么?谢谢

4

2 回答 2

2

因为您没有调用复制构造函数,所以您调用的是复制赋值运算符。复制构造函数调用将是:

MyClass<10,int> m2(m1);

您正在调用的函数具有签名:

template <std::size_t l, typename T>
MyClass<l, T>& operator=(const MyClass<l, T>& other);
于 2013-09-06T07:39:39.657 回答
1

而是调用隐式定义的赋值运算符。它执行成员分配(即在这种情况下实际上什么都不做),因此不会调用任何复制ctor。试试这个:

MyCLass<10,int> m1;
MyClass<10,int> m2 = m1;
于 2013-09-06T07:39:33.023 回答