Мышление в C ++ шаблонной специализации - PullRequest
1 голос
/ 11 декабря 2011

Среда: Microsoft Visual Studio 2010

Стандарт кодирования: C ++ 0x совместимый

У меня есть шаблон класса

template <typename T1, int I>
class A
{
    public template <typename T2> void f(T2 x);
    /*...*/
};

template <typename T1, int I>
template <typename T2>
void A<T1, I>::f(T2 x)
{
    /*...*/
}

и частичная специализация вышеуказанного класса

template <int I>
class A<char, I>
{
    public template <typename T2> void f(T2 x);
    /*...*/
};

Тогда можно ли специализировать функцию-член в частично специализированном классе, как показано ниже?

template <int I>
template <>
void A<char, I>::f<double>(double x)
{
}

Спасибо!

NB. Я не работаю над этим, но думаю, применимо это или нет. Легкая оценка, если вы знаете о правиле.

1 Ответ

1 голос
/ 11 декабря 2011

Это недопустимо, потому что вы не можете явно специализировать функцию-член, не задавая фиксированные аргументы шаблона для любого шаблона класса.

Не совместим с C ++ 11, но работает на MSVC

Компилятор Microsoft имеет расширение, которое позволяет объявлять явные специализации в шаблонах классов. Хотя я никогда не пробовал, есть вероятность, что он примет следующий нестандартный код

template <int I>
class A<char, I>
{
    public:
    template <typename T2> void f(T2 x);

    template<> void f<double>(double x) {

    }
    /*...*/
};

Обновление: Clang компилирует это и сообщает

// clang++ -fms-extensions main1.cpp
main1.cpp:10:21: warning: explicit specialization of 'f' within class scope is a
                 Microsoft extension [-Wmicrosoft]

  template<> void f<double>(double x) {
                  ^

C ++ 11 / C ++ 03 совместим

Путь здесь - перегрузка вместо специализации

template <int I>
class A<char, I>
{
    public:
    template <typename T2> void f(T2 x);

    void f(double x) {

    }
    /*...*/
};
...