c – 将结构作为模板参数传递 – 如何修复此代码?
发布时间:2020-12-16 10:17:40 所属栏目:百科 来源:网络整理
导读:我正在尝试在VC2010下编译以下代码. struct CircValRange{ double a,b; // range: [a,b)};template struct CircValRange* Rangeclass CircVal{ // todo};const CircValRange SignedDegRange= {-180.,180.};CircValSignedDegRange x; 我越来越 error C2970: '
我正在尝试在VC2010下编译以下代码.
struct CircValRange { double a,b; // range: [a,b) }; template <struct CircValRange* Range> class CircVal { // todo }; const CircValRange SignedDegRange= {-180.,180.}; CircVal<SignedDegRange> x; 我越来越 error C2970: 'CircVal' : template parameter 'Range' : 'SignedDegRange' : an expression involving objects with internal linkage cannot be used as a non-type argument 1> d:4circvalcircvalcircval.h(8) : see declaration of 'CircVal' 1> d:4circvalcircvalcircval.h(13) : see declaration of 'SignedDegRange' 我试图定义一个模板化的类CircVal,它将接收一个struct Range作为模板化参数. 我不希望可以将具有一个范围的类分配给具有另一个范围的类(我希望它们是不同的类型). 我该怎么做? 解决方法
有人推荐了一个构造函数参数,我是第二个.但你仍然可以按照最初的要求去做
struct CircValRange { double a,b) }; template <CircValRange const& Range> class CircVal { // todo }; extern const CircValRange SignedDegRange= {-180.,180.}; CircVal<SignedDegRange> x; 但请注意,确定CircVal的类型标识的属性< SignedDegRange>不是SignedDegRange的值,而是它的地址/标识.也就是说,以下不起作用,因为CircVal< SignedDegRange1>表示不同的类型 extern const CircValRange SignedDegRange1 = {-180.,180.}; CircVal<SignedDegRange1> y = x; // error! 因此,枚举可能更适合于此 enum RangeKind { SignedDegRange,UnsignedDegRange }; const CircValRange Ranges[] = { { -180.,-180. },{ 0.,360. } }; template <RangeKind Range> class CircVal { // todo }; 甚至是具有静态成员函数的traits类,类似于其他人拥有的解决方案 template <typename Range> class CircVal { // todo }; struct SignedDegRange { static double min() { return -180.; } static double max() { return 180.; } }; CircVal<SignedDegRange> x; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |