gpt4 book ai didi

C++模板特化方法问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:39:35 27 4
gpt4 key购买 nike

我是 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);
}

我尝试使用模板特化来处理特殊情况,但它给了我错误:

using ‘typename’ outside of template

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

最佳答案

看来您正在尝试部分特化函数模板,这在 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);
}

非正式地,当参数类型为 Complex<T> 时,编译器将始终选择重载 #2 而不是重载 #1因为这是更好的匹配。


使这项工作起作用的另一种方法是重载 Complex<> 的乘法运算符类使用the definition of multiplication for complex numbers .这具有更通用的优势,您可以将此想法扩展到其他运算符。

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

由于您是 C++ 新手,我强烈建议您选择 a good introductory C++ book .模板和运算符重载不完全是初学者的主题。

关于C++模板特化方法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6658590/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com