Невозможно разрешить неопределенную ссылку - PullRequest
0 голосов
/ 23 февраля 2019

У меня возникла проблема в шаблоне функции, из-за которой я пытаюсь создать экземпляр своей функции в Functions.cpp.Но сделав это, я получаю ошибку компиляции.Ниже ошибка, которую я получил.Если кто-нибудь сможет помочь, буду очень признателен!Спасибо!

Ошибка

Functions.cpp:81:15: error: template-id ‘remove<int>’ for ‘int 
CS150::remove(int*, int*, int*)’ does n template declaration
template int remove<int>(int *first, int*last,  int* val);
             ^~~~~~~~~~~

Functions.cpp:56:5: note: candidate is: template<class T> T* 
CS150::remove(T*, T*, T*)

T* remove(T *first, T *last,  T* val)
   ^~~~~~

Function.cpp

template <typename T> 
T* remove(T *first, T *last,  T* val)
{
    T result = first;
    while (first!=last) 
    {
        if (!(*first == val)) 
        {
        *result = *first;
        ++result;
        }
        ++first;
    }
    return result;
}
template int remove<int>(int *first, int*last,  int* val);

Functions.h

template <typename T> 
T* remove(T *first, T *last, const T& val);

файл драйвера

static void TestRemove1(void)
{
    cout << "***** Remove1 *****" << endl;
    int i1[] = { 5, -7, 4, 10, -21, 15, 9 };
    int size = sizeof(i1) / sizeof(int);
    CS150::display(i1, i1 + size);
    int item = -1;
    int * newend = CS150::remove(i1, i1 + size, item);
    cout << "remove " << item << ", new list: ";
    CS150::display(i1, newend);
}

static void TestRemove2(void)
{
    cout << "***** Remove2 *****" << endl;
    int i1[] = {5, -7, 4, 10, -7, 15, 9};

    int size = sizeof(i1) / sizeof(int);
    CS150::display(i1, i1 + size);
    int item = -7;
    int *newend = CS150::remove(i1, i1 + size,  item);
    cout << "remove " << item << ", new list: ";
    CS150::display(i1, newend);
}

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Ваша сигнатура функции шаблона говорит, что она возвращает T*, но определение вашей функции и создание экземпляра возвращают T (int).Вы должны заставить их соответствовать.

0 голосов
/ 23 февраля 2019

Вам не нужно ключевое слово template.Может сработать следующее (я до сих пор не уверен, зачем вам вообще нужна эта строка):

int remove<int>(int *first, int*last,  int* val);

Написав remove<int>, вы создаете экземпляр своего шаблона, поэтому он больше не является шаблоном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...