Разрешить полную специализацию шаблонов внутри классов (explicit specialization in non-namespace scope)

Amomum
Amomum

Сейчас подобный код не компилируется с не очень внятной ошибкой:

class A
{
    private:

    template< typename T>
    class Inner
    {
        T value;
    };

    template<>
    class Inner<int>
    {
        int value;
    };
};

error: "explicit specialization in non-namespace scope 'class A'"

Простое решение - сделать специализацию частичной, добавив фейковый параметр Dummy:

class A
{
    private:

    template< typename T, typename Dummy = void>
    class Inner
    {
        T value;
    };

    template< typename Dummy>
    class Inner< int, Dummy >
    {
        int value;
    };
};


Однако такой код длиннее и менее понятен. К тому же, частичная специализация невозможна для шаблонных методов, которые страдают от той же проблемы.
Следует так же отметить, что некоторые компиляторы (в частности, MSVC) компилируют первый сниппет вопреки стандарту - и вроде как полет нормальный.

Причины, по которым стандарт это запрещает, неясны.

Предлагаю разрешить.

9
рейтинг
1 комментарий
Антон Санаров

Стандарт это уже разрешает: http://open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#727. Изменение включено в C++17 и бэкпортировано на C++14.

GCC, к сожалению, пока не поддерживает подобные объявления. На эту тему открыт баг-репорт https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85282

Антон Санаров
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения