0

Заголовочный файл и объявление (task1.h):

#ifndef _TASK1_H_
#define _TASK1_H_

template<typename T>
void msort(T *array, int32_t length);

#endif _TASK1_H_

Определение (task1.cpp):

#include "task1.h"

template<typename T>
void msort(T *array, int32_t length)
{
    T *buffer = new T[length];
    msort(array, 0, length, buffer);
    delete buffer;
};

Вызов (main.cpp):

int32_t main()
{
    int *array = new int[10] { 10, 2, 8, 9, 3, 6, 7, 5, 4, 1 };
    msort<int32_t>(array, 10);
    for (int32_t i = 0; i < 10; i++)
        std::cout << array[i];

    return 0;
};

При сборке получается ошибка компоновки:

LNK2019 unresolved external symbol "void __cdecl msort(int *,int)" (??$msort@H@@YAXPAHH@Z) referenced in function _main

Если определять функцию сразу в заголовочном файле, линковка проходит без проблем. Может кто-нибудь подсказать, почему наблюдается подобное поведение?

Harry
  • 221,325
aa_talanin
  • 2,415
  • шаблоны в cpp файле, да вы суровый человек) – pavel Nov 05 '19 at 12:09
  • шаблонные функции должны определяться в заголовочном файле – goldstar_labs Nov 05 '19 at 12:09
  • Определение шаблонных функций должно быть доступно в каждой единице трансляции, их инстанцирующей. Такая доступность может быть достигнута либо помещением определения шаблона непосредственно в заголовочном файле, либо посредством явного инстанцирования нескольких специализаций в некоторой единице трансляции. – user7860670 Nov 05 '19 at 12:10
  • Занимательно. Я что-то не подумал, что конечный пользователь может захотеть инстанцировать шаблонную функцию для своего типа, но не увидит реализации. Оформите ответом, приму. – aa_talanin Nov 05 '19 at 12:12

0 Answers0