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

なぜ最初=3番目に電話をかけないのですか

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 に答える