C++模板类中的类型条件问题

4

使用GCC 4.2版本。 我有一个用于条件类型的元模板:

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;
};

当我像这样使用它:

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

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

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

我遇到了这个错误代码:

error: type 'IF<false, T&, T*>' is not derived from type 'Param<T>'

为什么会发生这种情况?如何解决? 提前感谢!

1
http://www.boost.org/doc/libs/1_42_0/libs/mpl/doc/refmanual/if-c.html - Matthieu M.
1个回答

8
在第二种情况下,RET的含义取决于模板类型T。编译器需要确保在所有可能的实例化中它将是一个类型(而不是IF的某个实例化的静态成员)。使用typename关键字可以做到这一点,以使编译器满意。
template <typename T>
class Param
{
    typename IF< sizeof(int)<sizeof(long), T&, T* >::RET mParam;

};

嗯,我们不能使用Clang自动回答那些“typename”问题吗? :) - Georg Fritzsche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接