c++模板专门化方法问题
c++ template specialization method question
我是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<>
类的乘法运算符。这样做的优点是更通用,并且您可以将此思想扩展到其他操作符。
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++新手,我强烈建议您选择一本好的c++入门书籍。模板和操作符重载并不是初学者的主题。
相关文章:
- 最小硬币更换问题(自上而下方法)
- 使用同一类中的方法重新分配字段时出现问题
- 我想直接在结构中插入,但没有一种方法可以正确避免填充问题
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 此动态编程问题的自上而下方法
- 此解决方案中生成更改的方法数量(自上而下)有什么问题?
- 使用模板方法为标头提供空 cpp 时出现问题
- 这种针对 N Queen 问题的回溯方法不正确吗?
- C++ push() 和 pop() 方法使用指针的动态 LinkedList 的问题
- 扩展中的日期时间对象方法C++问题
- 具有"else if"方法问题 C++ 的基本计算器
- 未实现的纯虚拟方法问题
- 抽象类和虚方法问题:"cannot allocate an object of abstract type"
- 方法问题 - 什么会改变值,什么不会改变?什么是无效的?
- jni原生方法问题
- GLUT回调方法问题
- string substr方法问题
- 抽象类和虚方法问题:不能将变量' list '声明为抽象类型' aStack
' aStack - c++模板专门化方法问题
- C++虚拟方法问题