c++;模板专门化方法问题 我是C++新手,我想用模板,但我遇到了问题。 我试图做的是:尝试使用模板计算一个数字的平方,这个数字可能是基本的数据类型,比如int、float以及复数。我还使用模板实现了一个复杂类,代码如下: template <typename T> class Complex { public: T real_; T img_; Complex(T real, T img) : real_(real), img_(img) { } }; template <typename T> T square(T num) { return num * num; } template <> Complex<typename T> square(Complex<typename T> num) { T temp_real = num.real_*num.real_ - num.img_*num.img_; T temp_img = 2 * num.img_ * num.real_; return Complex(temp_real, temp_img); }

c++;模板专门化方法问题 我是C++新手,我想用模板,但我遇到了问题。 我试图做的是:尝试使用模板计算一个数字的平方,这个数字可能是基本的数据类型,比如int、float以及复数。我还使用模板实现了一个复杂类,代码如下: template <typename T> class Complex { public: T real_; T img_; Complex(T real, T img) : real_(real), img_(img) { } }; template <typename T> T square(T num) { return num * num; } template <> Complex<typename T> square(Complex<typename T> num) { T temp_real = num.real_*num.real_ - num.img_*num.img_; T temp_img = 2 * num.img_ * num.real_; return Complex(temp_real, temp_img); },c++,templates,specialization,C++,Templates,Specialization,错误发生在模板专门化方法上。请指出我的错误。谢谢。 看来,您正在尝试部分地专门化函数模板,而实际上这在C++中是不可能的。相反,您需要的是像这样简单地重载函数: template<typename T> T square(T num) // Overload #1 { return num * num; } template<typename T> Complex<T> square(Complex<T> num) // Overloa

错误发生在模板专门化方法上。请指出我的错误。谢谢。

看来,您正在尝试部分地专门化函数模板,而实际上这在C++中是不可能的。相反,您需要的是像这样简单地重载函数:

template<typename T>
T square(T num) // Overload #1
{ 
    return num * num;
}

template<typename T>
Complex<T> square(Complex<T> num) // Overload #2
{
    T temp_real = num.real_*num.real_ - num.img_*num.img_;
    T temp_img  = 2 * num.img_ * num.real_;
    return Complex<T>(temp_real, temp_img);
}
模板
T平方(T num)//重载#1
{ 
返回num*num;
}
模板
复数平方(复数num)//重载#2
{
T temp_real=num.real_*num.real-num.img_*num.img;
T temp_img=2*num.img*num.real;
返回复合体(temp\u real、temp\u img);
}
非正式地说,当参数类型为
Complex
时,编译器总是选择重载#2 over重载#1,因为它更匹配


另一种方法是使用重载
Complex
类的乘法运算符。这样做的好处是更通用,您可以将此想法扩展到其他操作符

template <typename T>
class Complex
{
public:
    T real_; 
    T img_; 

    Complex(T real, T img) : real_(real), img_(img) {} 

    Complex operator*(Complex rhs) // overloaded the multiplication operator
    {
        return Complex(real_*rhs.real_ - img_*rhs.img_,
            img_*rhs.real_ + real_*rhs.img_);
    }
};

// No overload needed. This will work for numeric types and Complex<>.
template<typename T>
T square(T num)
{
    return num * num;
}
模板
阶级情结
{
公众:
不真实;
T img_;
复数(T实,T img):实(实),img(img){}
复数运算符*(复数rhs)//重载乘法运算符
{
返回复数(real_*rhs.real_u-img_*rhs.img),
img_*rhs.real+real_*rhs.img_);
}
};
//不需要过载。这将适用于数字类型和复杂类型。
模板
T平方(T个)
{
返回num*num;
}


<>因为你是C++新手,我强烈推荐你接电话。模板和操作符重载并不是初学者的话题。

不是答案,但请注意
标题,它可能完全不需要任何代码。
template <typename T>
class Complex
{
public:
    T real_; 
    T img_; 

    Complex(T real, T img) : real_(real), img_(img) {} 

    Complex operator*(Complex rhs) // overloaded the multiplication operator
    {
        return Complex(real_*rhs.real_ - img_*rhs.img_,
            img_*rhs.real_ + real_*rhs.img_);
    }
};

// No overload needed. This will work for numeric types and Complex<>.
template<typename T>
T square(T num)
{
    return num * num;
}