我正在尝试编写一个定点算术类,其中点位置和基础类型是模板
template <int P, typename T>
class basic_fixedpoint{
//stuff
};
我还想公开一个模板化的隐式构造函数,然后专门用于各种类型
//inside basic_fixedpoint
template <typename U>
basic_fixedpoint(const U& arg);
在其他地方,我将实现int,float,double等的特化。但是,我还想为任何类型的具有不同P和T的basic_fixedpoint提供泛型特化。如何将其作为模板化模板特化?< / p>
template <int P, typename T> //for the class whose constructor i specialize
template <int OP, typename OT> //for the parameters of the argument
basic_fixedpoint<P, T>::basic_fixedpoint<basic_fixedpoint<OP, OT> >(const basic_fixedpoint<OP, OT>& arg)
: /*init things here*/ {} // this fails
我试图避免重载构造函数,以便在头文件中显示单个接口,告诉用户“这个类将从你给它的任何类型中干净地构造自己,否则它将无法编译并给你一个难以理解的段落长错误信息“
作为子问题:该类还实现了基本运算符int(),运算符float(),运算符double()转换,还提供了重载算术运算符和数学函数。当然,每当我尝试用这个类调用任何东西时,调用都是模棱两可的,因为每种可能性都是可用的。
如何保持这个类完全灵活,但是仍然允许行为正常的无痛的明确重载函数调用(而不是总是将我的类转换为double和back)?
答案 0 :(得分:2)
我想你可能想重新考虑你真正想要的东西。隐式转换并不总是一个好主意(它们通常是一个坏主意)和一个可以隐式转换为相同类型的类总是一个坏主意(每当你使用该类时它会导致歧义错误可转换为/从类型一起,因为它可以双向。
您应该回到设计委员会并确定需要隐含的内容以及可以命名或显式转换的内容。
除此之外,关于你的特定问题,你不能专门化那个构造函数。函数(以及它们之间的构造函数)只能是完全专用的,特别是您不能专门化模板函数,它是模板类的成员,而不是完全专门化类模板。即你可以专攻:
basic_fixedpoint<5,int>::basic_fixed_point<int>(int)
但你无法专攻:
template <int N, typename T>
basic_fixed_point<N,T>::basic_fixed_point<int>(int)
由于N
和T
不受该专业化约束。