1

我有以下代码:

#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

为什么 first=third 不打电话给

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

?

4

2 回答 2

1

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

myclass<T>& operator= (myclass<T> const& rhs) {
    std::cout << "(copy) " << data << " = " << rhs.data << '\n';
    return *this;
}
于 2013-01-01T01:24:02.753 回答
0

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

于 2013-01-01T01:24:09.917 回答