Почему полностью специализированный шаблон класса не может быть определен в не полностью специализированном шаблоне? - PullRequest
0 голосов
/ 15 января 2019

Почему полностью специализированный шаблон класса не может быть определен в не полностью специализированном шаблоне?

template<typename TW>
struct Wrapper {
    template<typename T>
    struct Fun_ {
        constexpr static int vlaue = 0;
    };
    template<> // error
    struct Fun_<int> { // error
        constexpr static int value = 1;
    };
};

int main() {
}

GCC версия:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609

Ошибка GCC:

test.cpp:7:14: error: explicit specialization in non-namespace scope ‘struct Wrapper<TW>’
     template<>
              ^
test.cpp:8:12: error: template parameters not deducible in partial specialization:
     struct Fun_<int> {
            ^

Версия Clang:

clang version 6.0.0-1ubuntu2~16.04.1 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu

Ошибка лягушки:

test.cpp:8:12: error: explicit specialization of 'Fun_' in class
      scope
    struct Fun_<int> {
           ^

Однако, преобразовав полностью специализированный шаблон класса в частично специализированный с использованием дополнительного аргумента псевдо-шаблона, можно скомпилировать следующее:

template<typename TW>
struct Wrapper {
    // TDummy is a pseudo template argument with default value void
    template<typename T, typename TDummy = void>
    struct Fun_ {
        constexpr static int value = 0;
    };
    template<typename TDummy>
    struct Fun_<int, TDummy> { // partial specialization
        constexpr static int value = 1;
    };
};

int main() {
}
...