1

我想知道以下是否可能。假设我有这样的代码:

template <class NumberType>
struct Number
{
   NumberType value;

   void operator = (Number in_val)
   {
        value = in_val;
   }
}

那么我就可以做类似的事情:

Number<int> n1, n2;
n2.value = 5;
n1 = n2;
cout << "Value: " << n1.value << endl;

但这不允许我执行以下操作:

Number<int> n1;
Number<double> n2;
n2.value = 5;
n1 = n2;
cout << "Value: " << n1.value << endl;

如何使这成为可能?我是否必须用另一个包装这个结构/类,或者我是否必须进行一些花哨的递归?

ps 我已经使用 C++ 有一段时间了,但从未尝试过templates。所以考虑一下我对模板很陌生。

-- 编辑 -- 好的,我现在正确理解了。但是另一个相关的问题来了。

template<class OtherNumType>
Number& operator *= ( const OtherNumType& in_value)
{
    value *= in_value;
    return *this;
}

这会产生编译错误。为什么?正确的方法是什么?

4

2 回答 2

1

您可以提供一个模板 operator=

template<class OtherNumType>
Number<NumberType>& operator= ( const Number<OtherNumType>& in_val)
{
    value = in_val.value; // ok if the number types are implicitly convertable
    return *this;
}
于 2012-10-13T10:32:51.757 回答
1

Number<T>编译器为任何特定 type 考虑模板定义时T,名称Number(当用作类型名称时)被解释为Number<T>,无论T此时可能是什么。

因此,对于Number<int>,您当前的模板定义仅提供以下赋值运算符:

void operator=(Number<int> in_val)

因为当时Number被解释为Number<int>

为了使操作符更加灵活,可以将其变成成员模板(已经模板化的类中的模板化函数):

template <class NumberType>
struct Number
{
  NumberType value;

  template <typename T2>
  Number &operator=(const Number<T2> &in_val)
  {
    value = in_val.value;
    return *this;
  }
};

请注意,我如何修改运算符,不仅可以接受Number<T2>任何类型 T2,还可以使其返回*this并接受参数作为 const 引用——这是定义赋值运算符的最常见和最有用的方法。

于 2012-10-13T10:36:08.647 回答