我有一个模板类,应该允许void
作为模板参数。这个类有一个传递参数引用的函数,所以我做了以下几点:
template <typename T>
struct trait
{
typedef typename boost::conditional<
boost::is_void<T>::value,
void, T &
>::type type;
};
template <typename T>
struct foo
{
typename trait<T>::type ref()
{
// do something
}
};
然而,编译器声称我会在void
的实例化中形成对struct trait<void>
的引用。为什么这样,我怎样才能实现我的目标?
答案 0 :(得分:8)
当你说void
时,你明确地在条件类型定义中形成对T&
的引用。这似乎最好处理专业化:
template <typename T> struct trait { typedef T& type; };
template <> struct trait<void> { typedef void type; };