2010-08-22 20 views
4

使用GCC 4.2。 我有这个metatemplate有条件类型:C++模板类问题中的类型条件

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 – 2010-08-22 16:55:10

回答

8

在第二种情况下,RET是什么,取决于模板类型T。编译器需要确保它将成为所有可能实例化中的一个类型(而不是IF的某个实例化的静态成员)。您可以使用typename关键字。

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

}; 
+0

嗯,我们不能把使用锵为自动回答这些' typename'问题? :) – 2010-08-22 16:41:01