c++ - 模板类中模板函数的相同类型

标签 c++ templates function-templates class-template

我有以下代码:

#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)

?

最佳答案

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

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

关于c++ - 模板类中模板函数的相同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14107220/

相关文章:

c++ - cpp 松弛内存模型中发生的优化类型?

c++ - C++11 中使用模板参数的递归可变参数 void 函数

c++ - 函数模板 : Different specializations with type traits

c++ - 如何计算C++模板函数中有效指针元素的总数?

c++ - 如何使用 Qt C++ 从 linux 桌面环境获取当前主题名称

c++ - unordered_map 用于堆管理系统。是否可以进行无碰撞设置?

c++ - 在没有 static_cast<> 的派生类中重载 std::ostream& operator<<

templates - html/模板 : how to get JavaScript (JSON) escaping without &lt;script&gt; tag?

c++ - C++ 模板的别名?

c++ - template 模板参数,算作一个单独的参数