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

C++ 将结构作为模板参数传递-如何修复此代码?,c++,visual-c++,templates,parameters,struct,C++,Visual C++,Templates,Parameters,Struct,我试图在VC2010下编译以下代码 struct CircValRange { double a,b; // range: [a,b) }; template <struct CircValRange* Range> class CircVal { // todo }; const CircValRange SignedDegRange= {-180., 180.}; CircVal<SignedDegRange> x; 我试图定义一个模板化类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;
我试图定义一个模板化类CircVal,它将接收一个struct Range作为模板化参数

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

我该怎么做?

模板
template <class Range>
class CircVal
{
    // todo
};
类循环 { //待办事项 };

模板类循环;
模板
类循环{。。。
举例

CircVal<CircValRange> ...
CircVal。。。

我认为您省略了一个步骤。如果您想创建一个可以专门处理某一类型的模板循环,请编写:

template<typename Range>
class CircVal
{
   ...
};
模板
类循环
{
...
};
如果你想专门研究CircValRange,你可以在代码中创建一个实例


您似乎尝试并强制执行的是,它只接受从某个基类派生的类,但不幸的是,这不是模板的工作方式-您必须找到另一种方法来强制执行,可能是通过duck键入。

与其将其作为模板,为什么不要求将范围作为构造函数参数


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

class CircVal
{
public:
    CircVal(const CircValRange &_range) : range(_range) {}
private:
    CircValRange range;
    // todo
};


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

CircVal x(SignedDegRange);

这样,CircVal的每个实例都将有一个关联的范围。然后您可以重写赋值运算符,以防止使用不同的值进行赋值

或者,如果您对模板的另一种方式感兴趣,您可以对一系列模板执行以下操作:

template <int MIN, int MAX>
class range {
  static const int min = MIN, max = MAX;
};
template <class T>
class CircVal {
  //todo
};

CircVal< range<10,20> > x;
模板
等级范围{
静态常数int min=min,max=max;
};
模板
类循环{
//待办事项
};
CircValx;

当然,这不是很干净,也不是很有用。

有人推荐了一个构造函数参数,我支持它。但是你仍然可以按照最初的要求来做

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

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


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

CircVal<SignedDegRange> x;
因此,枚举可能更适合这种情况

enum RangeKind {
  SignedDegRange,
  UnsignedDegRange
};

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

template <RangeKind Range>
class CircVal
{
    // todo
};
enum RangeKind{
签名德朗格,
无符号梯度
};
const CircValRange范围[]={{-180.,-180.},{0,360.};
模板
类循环
{
//待办事项
};
或者甚至是带有静态成员函数的traits类,类似于其他人的解决方案

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

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

CircVal<SignedDegRange> x;
模板
类循环
{
//待办事项
};
结构签名范围{
静态双min(){return-180.}
静态double max(){return 180.}
};
圆圈x;

您是否尝试过使用
CircValRange range
而不是
struct CircValRange*range
作为类型参数?为什么需要阻止分配不同的范围?听起来好像您让它变得比必要的更难。我正在尝试为不同的范围创建不同的类类型,因此无法分配一个另一个。默认情况下,不可能为同一模板分配两个不同的实例化,例如,Foo to Foo,除非您特意编写了一个赋值运算符来完成此操作。我认为您自己太复杂了。我无法根据您的建议编写可编译的代码。您能添加完整的示例吗?谢谢对于您的建议。对于您的第一个建议:重写赋值运算符不会给我编译时错误。对于您的2st建议:它对double不起作用。我必须从您的第一个示例中删除“extern const”。我不确定为什么它不会用“const”编译,因此我无法保护SignedDeRange在运行时不被更改。此外,编译器将无法针对实际常量进行优化。我想我将使用您的第3个示例,它可能支持更好的编译器优化。如何使用第3个示例中的范围?向CircVal添加以下构造函数将无法编译:CircVal(){double d=Range.min();}好的。算出了。只需在我的类中添加静态Range;和CircVal(){double d=Range.min()和
范围::max()
当然,因为它们是静态成员函数。
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;