2012-10-13 65 views
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; 

如何使这成为可能? 我是否必须用另一个包装这个结构/类还是我必须做一些奇特的递归?

p.s. 我已经使用C++一段时间了,但从未尝试过templates。所以认为我对模板非常陌生。

- 编辑 - 好吧,我现在正确地得到它。但另一个相关的问题来了。

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

这给出了编译错误。为什么?什么是正确的方法?

+0

对于新内容(编辑后),最好发布一个新问题。 (但是,我认为编译失败的原因与你用于'OtherNumType'的类型有关,如果某个'T'是'Number ',则必须将函数定义更改为'value * = in_value.value '。) – jogojapan

+0

没有它只是一个整数 – Deamonpog

+0

你得到什么错误? (或者你是否发布了一个单独的问题?) – jogojapan

回答

1

Number<T>模板定义是由编译器对任何特定类型的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并接受参数作为常量引用–这是定义赋值运算符最常见和有用的方法。

+0

谢谢你的所有信息。我在很多地方都看到了赋值运算符的这种实现(没有模板的东西),并且有时也会盲目地使用它。我明白为什么我们会返回保存的值以及为什么使用“const”关键字。但我总是想知道为什么我们将这个值作为参考。这会是一件坏事吗?我的意思是如果有人把它作为指针并改变它,它会改变对象内部的值,仪式?这应该是一个单独的问题。但如果你有任何链接,我会去那里学习:)非常感谢你们所有人:) – Deamonpog

+0

@Deamonpog我们不返回保存的值;我们返回'* this',这是对当前对象的引用。我们通过引用而不是指针来做这件事的原因是它可以很容易地使分配操作成为操作链的一部分,例如,如果你有对象'Number n1,n2',你可以这样做:'if((n1 = f(x))== n2)'。即你将一个赋值('f(x)'的结果赋值给'n1'),然后立刻用它来比较(到'n2')。如果我们返回了一个指针,我们将不得不对其进行解引用,而我们的代码将不那么直观。 – jogojapan

+0

是的,我明白这一点。我的意思是说某人可以做一件事情,比如# * p =&(n1 = f(x));'rite? – Deamonpog

1

可以提供一个模板操作员=

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; 
} 
+0

非常感谢。 – Deamonpog

相关问题