явное создание экземпляра шаблона функции с целыми числами в качестве параметров шаблона

Я пытаюсь явно создать экземпляр шаблона функции. Пожалуйста, посмотрите фрагмент кода

основной.cpp:

void func(int * );

int main()
{
    int m = 3, n = 5;

    int *ptr;

    ptr = &m;

    func(ptr); //function call

    <do-Something>
    .....
    .....

}

Функция func() находится в этом файле cpp.

func.cpp :

#include "class_def.h"

template <int x1, int x2, int x3>
void sum(int *, myclass<x1, x2, x3> &); //template declaration

void func(int *in)
{
    myclass<1,2,3> var;
    sum(in,var);  //call to function template
    <do-Something>
    .....
    .....

}

class_def.h :

template<int y1, int y2, int y3>
class myclass
{
public:
    int k1, k2, k3;
    myclass()
    {
        k1 = y1;
        k2 = y2;
        k3 = y3;
    }
};

Определение шаблона функции "сумма" находится в другом файле hpp.

определить.hpp :

#include "class_def.h"

template <int x1, int x2, int x3>
void sum(int *m, myclass<x1, x2, x3> & n)  //function template definition
{
    <do-Something>
    .....
    .....
}

Теперь для создания экземпляра этого шаблона я написал следующий оператор кода под определением.

template void sum<int, int, int>(int *, myclass<1, 2, 3> &);

Но все же я получаю ошибку связи, поскольку

неопределенная ссылка на недействительную сумму‹1, 2, 3>(int*, myclass‹1, 2, 3>&)

Что я здесь делаю неправильно?


person Goutham    schedule 08.06.2015    source источник
comment
Включен ли define.hpp в какой-либо модуль компиляции?   -  person eerorika    schedule 08.06.2015
comment
@ user2079303: Нет. Нет.   -  person Goutham    schedule 08.06.2015


Ответы (1)


Вы говорите, что define.hpp не включен ни в одну единицу компиляции. Ну, это твоя проблема. Потому что теперь ни определения шаблона, ни явного экземпляра не существует ни в одной единице компиляции, и поэтому они никогда не будут скомпилированы.

Изменение файла из заголовка в исходный файл и добавление его в компиляцию должно исправить это.

Кроме того, в экземпляре есть синтаксическая ошибка. Должно быть template void sum<1, 2, 3>(int *, myclass<1, 2, 3> &);, как указал Jarod42.

person eerorika    schedule 08.06.2015
comment
Спасибо за быстрый ответ. Я изменил файл заголовка на исходный файл, и теперь я получаю эту ошибку: идентификатор шаблона 'sum‹int, int, int›' для 'void sum(int*, myclass‹1, 2, 3›&)' не соответствовать любому объявлению шаблона. - person Goutham; 08.06.2015
comment
@quintello: должно быть template void sum<1, 2, 3>(int *, myclass<1, 2, 3> &); - person Jarod42; 08.06.2015