加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读