Сегодня рассмотрим специализацию шаблонов.
Создадим класс шаблонный 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;
}
Создадим класс шаблонный 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;
}
Комментариев нет:
Отправить комментарий