如何在void上定义部分专用模板?

时间:2016-12-22 15:52:51

标签: c++ c++11 templates sfinae template-specialization

在部分特化时,我在分离内部类的实现时遇到问题。以下示例代码说明了我的问题:

#include <type_traits>

template <typename T>
using enable_if_copyable = std::enable_if_t<std::is_copy_constructible<T>::value>;

template <typename T>
using enable_if_not_copyable = std::enable_if_t<!std::is_copy_constructible<T>::value>;

template <typename T, typename Enabled=void> 
struct Foo;

template <typename T>
struct Foo<T, enable_if_copyable<T>>
{
    struct Bar
    {
        Bar();
    };
};

template <typename T>
struct Foo<T, enable_if_not_copyable<T>> {
    struct Bar
    {
        Bar();
    };
};

template <>
struct Foo<void,void>
{
    struct Bar
    {
        Bar();
      //Bar() {} This compiles, but it is not what I want.
    };
};

template <typename T>
Foo<T, enable_if_copyable<T>>::Bar::Bar()
{}    

template <typename T>
Foo<T, enable_if_not_copyable<T>>::Bar::Bar()
{}

template <>
Foo<void, void>::Bar::Bar() // this does not compile
{}


int main() {
    Foo<int>::Bar b;
    Foo<void>::Bar v;
}

由于依赖关系,我必须在声明之外实现Bar的c'tors。 我的问题是所有编译器(Clang,gcc,Visual Studio 2015)都在Foo<void, void>::Bar::Bar() {}声明之外抱怨class Foo<void, void>的实现。如果我在Bar的专业化中实现void的c'tor,我没有任何问题。 这是不可行的还是有人可以帮助我发现我的问题? 非常感谢提前!

1 个答案:

答案 0 :(得分:2)

尝试删除template<>;我的意思是:

// template <>
Foo<void, void>::Bar::Bar() // now compile
{}

有关详细信息,请参阅this page