在C++模板类问题中键入条件

k3a*_*k3a 4 c++ templates metaprogramming

使用GCC 4.2.我有条件类型的metatemplate:

template <bool condition, typename Then, typename Else>
struct IF
{
    typedef Then RET;
};

template <class Then, class Else>
struct IF<false, Then, Else>
{
    typedef Else RET;
};
Run Code Online (Sandbox Code Playgroud)

当我像这样使用它时:

template <typename T>
class Param
{
    IF< sizeof(int)<sizeof(long), long, int>::RET  i;
};
Run Code Online (Sandbox Code Playgroud)

它工作,但当我像这样使用它(尝试使用模板参数):

template <typename T>
class Param
{
    IF< sizeof(int)<sizeof(long), T&, T* >::RET mParam;
};
Run Code Online (Sandbox Code Playgroud)

我收到此错误代码:

error: type 'IF<false, T&, T*>' is not derived from type 'Param<T>'
Run Code Online (Sandbox Code Playgroud)

为什么会这样?怎么解决?提前致谢!

Unc*_*ens 8

在第二种情况下,RET取决于模板类型T.编译器需要确保它将成为所有可能的实例化中的类型(并且可能不是IF的某些实例化的静态成员).您可以使用typename关键字进行操作.

template <typename T>
class Param
{
    typename IF< sizeof(int)<sizeof(long), T&, T* >::RET mParam;

};
Run Code Online (Sandbox Code Playgroud)