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作为模板化参数.
我不希望可以将具有一个范围的类分配给具有另一个范围的类(我希望它们是不同的类型).
我该怎么做?
有人推荐了一个构造函数参数,我是第二个.但你仍然可以按照最初的要求去做
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)