将结构作为模板参数传递 - 如何修复此代码?

Lio*_*gan 3 c++ parameters templates struct visual-c++

我正在尝试在VC2010下编译以下代码.

struct CircValRange
{
    double a,b; // range: [a,b)
};

template <struct CircValRange* Range>
class CircVal
{
    // todo
};


const CircValRange SignedDegRange= {-180., 180.};

CircVal<SignedDegRange> x;
Run Code Online (Sandbox Code Playgroud)

我越来越

error C2970: 'CircVal' : template parameter 'Range' : 'SignedDegRange' : an expression involving objects with internal linkage cannot be used as a non-type argument
1>          d:\4\circval\circval\circval.h(8) : see declaration of 'CircVal'
1>          d:\4\circval\circval\circval.h(13) : see declaration of 'SignedDegRange'
Run Code Online (Sandbox Code Playgroud)

我试图定义一个模板化的类CircVal,它将接收一个struct Range作为模板化参数.

我不希望可以将具有一个范围的类分配给具有另一个范围的类(我希望它们是不同的类型).

我该怎么做?

Joh*_*itb 6

有人推荐了一个构造函数参数,我是第二个.但你仍然可以按照最初的要求去做

struct CircValRange
{
    double a,b; // range: [a,b)
};

template <CircValRange const& Range>
class CircVal
{
    // todo
};


extern const CircValRange SignedDegRange= {-180., 180.};

CircVal<SignedDegRange> x;
Run Code Online (Sandbox Code Playgroud)

但是请注意,决定的类型,身份属性CircVal<SignedDegRange>没有价值SignedDegRange,但地址吧/身份.也就是说,以下不起作用,因为CircVal<SignedDegRange1>表示不同的类型

extern const CircValRange SignedDegRange1 = {-180., 180.};

CircVal<SignedDegRange1> y = x; // error!
Run Code Online (Sandbox Code Playgroud)

因此,枚举可能更适合于此

enum RangeKind {
  SignedDegRange,
  UnsignedDegRange
};

const CircValRange Ranges[] = { { -180., -180. }, { 0., 360. } };

template <RangeKind Range>
class CircVal
{
    // todo
};
Run Code Online (Sandbox Code Playgroud)

甚至是具有静态成员函数的traits类,类似于其他人拥有的解决方案

template <typename Range>
class CircVal
{
    // todo
};

struct SignedDegRange {
  static double min() { return -180.; }
  static double max() { return  180.; }
};

CircVal<SignedDegRange> x;
Run Code Online (Sandbox Code Playgroud)