使用带模板的typedef

时间:2015-04-10 08:24:13

标签: c++ templates

下面的代码taken from here(并修改了一下)使用g ++编译器生成以下错误消息: 错误:'typedef'的模板声明 /RangeChecks.hpp:145:12:错误:'IsInRange'没有命名类型

以下是我的RangeChecks.hpp文件中的相关部分:

class GreaterEqual
{
  public:
     template <class T>
     static bool Compare (const T& value, const T& threshold)
     {
        return !(value < threshold); /* value >= threshold */
     }
};

class LessEqual
{
  public:
     template <class T>
     static bool Compare (const T& value, const T& threshold)
     {
        return !(value > threshold); /* value <= threshold */
     }
};

template <class L, class R, class T>
bool IsInRange (const T& value, const T& min, const T& max)
{
     return L::template Compare<T> (value, min) && R::template Compare<T> (value, max);
}

typedef IsInRange< GreaterEqual , LessEqual > isInClosedRange;

我在互联网上搜索了一个答案,并且有一些类似的东西,但是我找不到它们,解决了我的问题。

2 个答案:

答案 0 :(得分:4)

IsInRange是一个函数,而不是一个类型。做你想做的最简单的方法就是写一个包装器:

template<class T>
bool isInClosedRange(const T& value, const T& min, const T& max) {
    return IsInRange<T, GreaterEqual, LessEqual>(value, min, max);
}

答案 1 :(得分:3)

IsInRange是一个函数模板,而不是一个类模板,所以它的实例化不是一个类型,所以你不能为它创建一个typedef。