与模板类内部的模板函数类型相同

Same type for template function inside template class

本文关键字:类型 函数 内部      更新时间:2023-10-16

我有以下代码:

#include <iostream>
using namespace std;
template<typename T> class myclass {
public:
    T data;
    myclass(T const & _data = T()) : data(_data) {}
    template<typename U> myclass<T> & operator=(myclass<U> const & rhs) {
        cout << data << " = " << rhs.data << endl;
        return *this;
    }
};
int main() {
    myclass<double> first(1);
    myclass<float> second(2);
    myclass<double> third(3);
    first=second;
    first=third;
}

现在,尽管它编译得很好,但输出只有:

1 + 2

为什么第一个=第三个不打电话给

myclass<double> & operator=(myclass<double> const & rhs)

?

复制赋值操作符绝不是函数模板。由于类没有声明拷贝赋值操作符,编译器生成一个并使用这个生成的操作符。如果添加这样的操作符,您将看到赋值:

myclass<T>& operator= (myclass<T> const& rhs) {
    std::cout << "(copy) " << data << " = " << rhs.data << 'n';
    return *this;
}

复制赋值操作符从来不是模板。由于您没有定义一个,因此为您定义了一个默认版本(它不打印任何内容)。