Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 形成对空的引用_C++_Templates - Fatal编程技术网

C++ 形成对空的引用

C++ 形成对空的引用,c++,templates,C++,Templates,我有一个模板类,它应该允许void作为模板参数。此类确实有一个传递参数引用的函数,因此我执行了以下操作: template <typename T> struct trait { typedef typename boost::conditional< boost::is_void<T>::value, void, T & >::type type; }; template <typename T

我有一个模板类,它应该允许
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
    }
};
模板
结构特征
{
typedef typename boost::条件<
boost::is_void::value,
无效,T&
>::类型类型;
};
模板
结构foo
{
typename特征::type ref()
{
//做点什么
}
};

然而,编译器声称我将在
struct trait
的实例化中形成对
void
的引用。为什么会这样?我怎样才能实现我想要的?

好吧,当你说
T&
时,你在条件类型定义中清楚地形成了对
void
的引用。这似乎最好通过专业化来处理:

template <typename T> struct trait { typedef T& type; };
template <> struct trait<void> { typedef void type; };
模板结构特征{typedef T&type;};
模板结构特征{typedef void type;};

通过使用标准的
std::add_lvalue\u reference
,您还可以轻松地复制,该标准仅适用于
void
…和
const void
volatile void
等。这是个好主意