У меня есть проблема в разделении реализаций внутреннего класса с частичной специализацией. Вот пример кода, который иллюстрирует мою проблему:Как реализовать частично специализированный шаблон на 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
, у меня никаких проблем. Разве это не выполнимо или есть тот, кто мог бы помочь мне определить мою проблему? Большое спасибо заранее!