我正在尝试在 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:\4\circval\circval\circval.h(8) : see declaration of 'CircVal'
1> d:\4\circval\circval\circval.h(13) : see declaration of 'SignedDegRange'
我正在尝试定义一个模板化类 CircVal,它将接收一个结构范围作为模板化参数。
我不希望将一个范围的类分配给另一个范围的类(我希望它们是不同的类型)。
我该怎么做?
最佳答案
有人推荐了构造函数参数,我赞同。但是你还是可以按原意去做
struct CircValRange
{
double a,b; // range: [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
};
或者甚至是具有静态成员函数的特征类,类似于其他人的解决方案
template <typename Range>
class CircVal
{
// todo
};
struct SignedDegRange {
static double min() { return -180.; }
static double max() { return 180.; }
};
CircVal<SignedDegRange> x;
关于c++ - 将结构作为模板参数传递 - 如何修复此代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3791085/