5

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>。なぜそうなのか、どうすれば自分の望むことを達成できるのでしょうか。

4

1 に答える 1

10

さて、あなたvoidが言うとき、あなたはあなたの条件付き型定義で明確にへの参照を形成しますT&。これは専門分野で最もよく扱われるようです:

template <typename T> struct trait { typedef T& type; };
template <> struct trait<void> { typedef void type; };
于 2012-10-19T05:20:22.017 に答える