none
Специализация шаблонного метода шаблонного класса RRS feed

  • Вопрос

  • Здравствуйте. Не получается составить специализацию метода, помогите пожалуйста. Вот:

    #include"stdafx.h"
    #include"iostream"
    using namespace std;
    template<class Type> class base
    {
    public:
     template<class InnerType> void test(){
      cout << "В общей спецификации.\n";
     }
     template<> void test<int>();
    };
    template<class Type> template<> void base<Type>::test<int>(){
     cout << "В int спецификации.\n";
    }

    int main(){
     setlocale(LC_ALL, "Ru");
     base<int> ob;
     ob.test<int>();
     system("pause");
    }

    При чём самое обидное, что если не выносить реализацию метода за пределы объявления класса, что всё гуд. Также примечательно, что явное указание типа срабатывает:

    #include"stdafx.h"
    #include"iostream"
    using namespace std;
    template<class Type> class base
    {
    public:
     template<class InnerType> void test(){
      cout << "В общей спецификации.\n";
     }
     template<> void test<int>();
    };
    template<> template<> void base<int>::test<int>(){
     cout << "В int спецификации.\n";
    }
    int main(){
     setlocale(LC_ALL, "Ru");
     base<int> ob;
     ob.test<int>();
     system("pause");
    }

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

    28 февраля 2015 г. 20:07

Ответы

  • Да, задачки Вы ставите, однако :) После некоторого исследования и "копания" в стандарте пришел к выводу, что метод-шаблон может быть специализирован только для ранее специализированного класса-шаблона, содержащего этот метод. Именно поэтому конструкция

    template<> template<> void base<int>::test<int>()
    {
    }

    работает (имеется специализация класса base). По той же причине gcc и запрещает специализацию метода-шаблона внутри класса.

    VS закрывает на это глаза, но требует определения специализации метода внутри класса, т.к. синтаксически внешнее определение любого метода класса-шаблона должно начинаться с template<class Type>, а не с template<>.

    Кстати, по поводу предыдущего вопроса. Я встретил таки сточку в стандарте об этом:

    "An explicit specialization declaration shall not be a friend declaration."

    Вот так.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    1 марта 2015 г. 14:53