явное создание шаблонной функции в шаблонном классе

Заголовочный файл класса выглядит следующим образом:

 enum class My_Type {
     type1,
     type2
 };

 template <int dim>
 class My_Class {
 public:
     My_Class() {};

     template <My_Type p_type>
     void
     func();
 }

СРР-файл:

template <int dim>
template <My_Type p_type>
void
My_Class<dim>::func() {
     if (p_type==My_Type::type1) {
         ...
     } else {
         ...
     }
     ....
}

вызов выглядит следующим образом:

My_Class<2> my_obj;
my_obj.template func<My_Type::type1>();

Все компилируется нормально, но не линкуется:

'Undefined symbols for architecture x86_64'

Это потому, что часть кода находится внутри библиотеки. Таким образом, мне нужно явно создать экземпляр.

Для класса это очевидно:

 template class My_Class<2>;

Вопрос в том, как в таком случае создать экземпляр шаблонной функции? Любые трюки или обходные пути?

p/s/ как видно из enum, я использую C++11, если это имеет значение.

p/p/s/ Я просмотрел пару ссылок, но не уверен, что видел решение.


person Denis    schedule 04.06.2013    source источник
comment
Можно сделать это таким образом, если вы знаете полный конечный набор всех полезных экземпляров, но обычно проще просто поместить все определения шаблонов в заголовочные файлы. (И наличие параметра int не похоже на то, что у него должно быть всего несколько возможных экземпляров.)   -  person aschepler    schedule 04.06.2013
comment
@aschepler спасибо за совет. если что-то разрастется, я перенесу определения в заголовок. Пока у меня всего 4 варианта для обоих шаблонных аргументов.   -  person Denis    schedule 04.06.2013


Ответы (1)


Как ни странно, методом проб и ошибок я вывел правильный синтаксис:

template class MyClass<2>;
template void MyClass<2>::func< My_Type::type1>();
template void MyClass<2>::func< My_Type::type2>();
person Denis    schedule 04.06.2013