【发布时间】:2013-05-03 09:24:05
【问题描述】:
我正在尝试创建一个包含整数值的 C++ 模板类,并检查该值是否始终在有效范围内,因此简化代码如下:
struct OutOfRangeError
{ };
template<int MIN, int MAX, typename TYPE>
struct IntegerRange
{
private:
TYPE mValue;
public:
IntegerRange(const TYPE value) : mValue(value)
{
if (MIN > value || value > MAX)
{
throw OutOfRangeError();
}
}
operator TYPE() const
{
return mValue;
}
}
前面的代码可以工作,但是在使用这个类时它有一点缺点。这是一个示例:
typedef IntegerRange<0, 4, int> range1_t;
typedef IntegerRange<0, 5, int> range2_t;
range1_t a = 3;
//range2_t b = a; // This does not work
range2_t b = static_cast<int>(a); // This works OK
因此,要在不同范围之间分配值,我必须显式转换为给定的 TYPE。我想有一个解决方案来避免这种显式转换并处理 IntegerRange 类,因为它们是普通整数。所以开发者应该感觉到他是在处理普通的整数而不是类。
为了解决这个问题,我尝试了不同的方法。一个工作是以下一个作为附加构造函数:
template<typename RANGE_TYPE>
IntegerRange(const RANGE_TYPE &value) :
mValue(static_cast<const TYPE>(value))
{
if (MIN > mValue || mValue > MAX)
{
throw OutOfRangeError();
}
}
但是,即使这样可行,我也不喜欢太多,因为 RANGE_TYPE 可以是任何能够转换为 TYPE 的类型,并且我想将其限制为仅 IntegerRange 类。为了将其仅限制为 IntegerRange 类,我尝试了以下方法,但它没有编译,我不明白原因:
template<int ARG_MIN, int ARG_MAX, typename ARG_TYPE>
IntegerRange(const IntegerRange<ARG_MIN, ARG_MAX, typename ARG_TYPE> &value) :
mValue(static_cast<const TYPE>(value))
{
if (MIN > value || value > MAX)
{
throw OutOfRangeError();
}
}
问题是 2:
* 为什么最后一段代码没有编译,我需要更改什么来编译它。
* 有没有更好的方法来避免我缺少的显式演员?
谢谢
【问题讨论】:
-
错误信息是什么?
-
错误信息是:error: conversion from 'range1_t {aka IntegerRange}' to non-scalar type 'range2_t {aka IntegerRange}'在 gcc 上请求。
-
你能逐字发布你的整个代码吗?我认为它应该有效。
-
我在 g++ ../lib/src/IntegerRanges.hpp:141:31 上收到以下错误:错误:预期在数字常量 ../lib/src/IntegerRanges.hpp 之前有 '>' :142:84: 错误:模板参数 3 无效
标签: c++ template-meta-programming