-1

这是我为开始使用类模板而编写的代码。

#include<iostream>
using namespace std;
template<class T>
class Complex
{
T *real,*imag;
public:
    Complex(T a)
    {
    real=new T;
    imag=new T;
        *real=a;
        *imag=0;
    }
    Complex(T a,T b)
    {
    real=new T;
    imag=new T;
        *real=a;
        *imag=b;
    }
    Complex()
    {
    real=new T;
    imag=new T;
        *real=0;
        *imag=0;
    }   
template<class R>       
friend ostream& operator<<(ostream &out,Complex<R> &C);
template<class R>
friend istream& operator>>(istream &in,Complex<R> &C);
template<class R>
friend Complex<R> operator +(Complex<R> a,Complex<R> b);    
};
template<class R>
ostream& operator<<(ostream &out,Complex<R> &C)
    {
    out<<"The number is "<<*C.real<<"+"<<*C.imag<<"i"<<endl;
    return out; 
    }
template<class R>       
istream& operator>>(istream &in,Complex<R> &C)
    {
    cout<<"Enter the number ";
    in>>*C.real>>*C.imag;
    return in;  
    }
template<class R>       
Complex<R> operator +(Complex<R> a,Complex<R> b)
{
Complex<R> temp;
*temp.real=*a.real+*b.real;
*temp.imag=*a.imag+*b.imag;
return temp;    
}       
int main()
{
Complex<float> C1,C2(4.2,6.8),C3,C4;
C1=5;
C3=3+C1;
C4=C2+C3;
cout<<C1;
cout<<C2;
cout<<C3;
cout<<C4;
}

这段代码一切正常,除了当我尝试使用像“3+C2”这样的整数值时它显示错误。如果在不使用模板的情况下考虑相同的代码 '3+C2' 调用友元函数 operator+(Complex a,Complex b) 并且 3 被复制到调用单参数构造函数的对象 a 中,并且 3 将被分配给实部复杂类。使用类模板时如何做到这一点?使用类模板时,如何将数字传递给 operator+() 函数而不是 Complex 对象时调用单参数构造函数?

4

1 回答 1

1

有类似的东西

template<class R>
Complex<R> operator +(Complex<R>, Complex<R>);

类型R是独立于每个函数参数推导出来的;两个推导都必须成功,并且推导的类型必须匹配才能使用。由于 3 不是 a Complex,因此扣除失败并且不考虑过载。

有两种方法可以解决这个问题。一种是使用非模板朋友:

template<class T>
class Complex {
   // ...
   friend Complex operator+(Complex a, Complex b) {
      // ...
   }
};

这将实例化为一个非模板友元函数,它很乐意考虑隐式转换。

另一种方法是提供仅从一个参数推导出的附加重载:

template<class T> struct identity { using type = T; };
template<class T> using nondeduced_t = typename identity<T>::type;

template<class R>
Complex<R> operator +(nondeduced_t<Complex<R>>, Complex<R>) { /* ... */ }

template<class R>
Complex<R> operator +(Complex<R>, nondeduced_t<Complex<R>>) { /* ... */ }

这是所采取的方法std::basic_string_view


顺便说一句,你的实现被严重破坏了。它会泄漏内存,就像没有明天一样 -T首先没有理由动态分配 s 。

于 2016-04-06T20:47:12.163 回答