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

标签 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;

我得到了

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/

相关文章:

c++ - 对象可能修改的函数

c++ - 如何将一个类的成员函数用作另一个类的友元函数?

c++ - 接收 std::pair 作为参数并从花括号列表初始化中推导出类型的模板化函数

c++ - 基于不同枚举类值 union 的模板工厂

c++ - std::vector<std::pair<const int, const int>>::clear() VS 2010 无编译

c++ - 'return *this' 在 C++ 中是什么意思?

c++ - MSVC : Using link. 手动执行

c++ - FindWindow 没有找到窗口

c++ - 在 "template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::type arg) { ... }

c++11 参数包错误行为与 Apple LLVM 7.0.0 但适用于 GCC-5.1