вторник, 16 апреля 2013 г.

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

Сегодня рассмотрим специализацию шаблонов.

Создадим класс шаблонный A.

#include <string>
#include <iostream>

template <class T>
class A
{
private:
std::string f;
public:
void method();
};

template<class T>
void A<T>::method()
{
   f = "some type";
   std::cout << f << std::endl;
}


Теперь создадим специализацию для int:

template<>
class A<int>
{
private:
  std::string f;
public:
  void method();
};


Если мы омределим method следующим образом:

template <>
void A<int>::method()
{
  f = "int";
  std::cout << f << std::endl;
}
,
то получим ошибку о том, что метод нельзя спицифицировать дважды. В Visual Studio это ошибка №C2910. MSDN говорит, что требуется убрать template <> . Однако в полученном коде:
void A<int>::method()
{
  f = "int";
  std::cout << f << std::endl;
}

возникает ошибка линковки - функция-член method определена дважды в объектном файле.

Работающий вариант:
inline void A<int>::method()
{
  f = "int";
  std::cout << f << std::endl;
}


Комментариев нет:

Отправить комментарий