Чтобы использовать специализацию, ее определение всегда должно быть видно вызывающей стороне.Если, например, у вас есть template <class Type, bool flag> struct something
, определенный в одном заголовке, и template <class Type> struct something<Type, true> : public something<Type, false>
, определенный во втором, для использования последнего вам необходимо включить второй заголовок .Без этого вы всегда получите первый, более общий тип.
РЕДАКТИРОВАТЬ: бит о декларировании вперед заставил меня задуматься.Если вы хотите использовать только объявление типа, как в переменной указателя, сделайте следующее:
Заголовок
template <class Type, bool flag>
struct something;
struct Test
{
something<int, true>* ptr; // definition not needed
Test();
}
Источник
#include "something.h" // header with template
#include "something_spec.h" // header with specialisation
Test::Test()
{
ptr = new something<int, true>(); // specialisation used
}