2016-12-22 2 views
2

У меня есть проблема в разделении реализаций внутреннего класса с частичной специализацией. Вот пример кода, который иллюстрирует мою проблему:Как реализовать частично специализированный шаблон на void отдельно от определения?

#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; 
} 

Из-за зависимостей, которые я должен выполнить c'tors из Bar за пределами своей декларации. Моя проблема в том, что весь компилятор (Clang, gcc, Visual Studio 2015) жалуется на реализацию Foo<void, void>::Bar::Bar() {} за пределами декларации class Foo<void, void>. Если я реализую c'tor Bar внутри специализации на void, у меня никаких проблем. Разве это не выполнимо или есть тот, кто мог бы помочь мне определить мою проблему? Большое спасибо заранее!

ответ

2

Попробуйте удалить template<>; я имею в виду:

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

См this page для получения более подробной информации.

Смежные вопросы