【问题标题】:Templated copy assignment operator模板复制赋值运算符
【发布时间】:2020-02-28 07:20:36
【问题描述】:

根据 cppreference,复制赋值运算符不应模板化:

类 T 的复制赋值运算符是一个非模板非静态成员函数,其名称为 operator=,它只接受一个类型为 T、T&、const T&、volatile T& 或const volatile T&"

但是在这个示例程序中,我写了一个模板赋值运算符,没有编译问题,它实际上被调用(而不是默认隐式生成)。

template<typename T1>
class Sample
{
public:
        T1 a;
        Sample(T1 b)
        {
                a=b;
        }

        template<typename T2>
        void operator  = (T2& obj2)
        {
                cout<<"This wont be called";
                (*this).a=obj2.a;
        }

};


        Sample<int> obj1(2);
        Sample<int> obj2(3);

        obj2=obj1;

输出:

This wont be called

我是不是误会了什么?

【问题讨论】:

    标签: c++ templates


    【解决方案1】:
    template<typename T2>
        void operator=(T2& obj2) { ... }
    

    定义了一个operator= 函数,但它不是标准的复制赋值运算符。要成为复制赋值运算符,它必须是:

    void operator=(Samble& obj2) { ... }
    

    或更好

    Sample& operator=(Sample const& obj2) { ... }
    

    根据您的代码,您可以使用:

    Sample<int> a;
    Samble<double> b;
    b = a;
    

    如果你有真正的复制赋值运算符,那将无法编译。

    【讨论】:

    • 换句话说,你是说 operator=() 被称为赋值运算符,当它接受一个具体类型作为参数时,它不是赋值运算符,而是 =() 如果参数是模板类型(例如T)。如果这就是你所说的那我们不只是在玩文字吗,因为我看到意思没有改变
    【解决方案2】:

    template&lt;typename T2&gt; void operator = (T2&amp;) 不是复制赋值运算符。

    所以会生成默认的void operator = (const Sample&amp;)

    但你的更适合:

    Sample<int> obj1(2);
    Sample<int> obj2(3);
    obj2 = obj1;
    

    但是有

    const Sample<int> obj1(2);
    Sample<int> obj2(3);
    obj2 = obj1;
    

    你会得到你预期的结果:

    Demo

    【讨论】:

      猜你喜欢
      • 2016-05-18
      • 2019-06-30
      • 2017-11-21
      • 2015-01-27
      • 2011-11-14
      • 2016-09-03
      • 2012-10-05
      • 2015-02-25
      相关资源
      最近更新 更多