Отсутствует список аргументов для шаблона класса
у меня любопытный вопрос, и я не совсем уверен в чем проблема. Я создаю класс LinkedArrayList, который использует шаблон typename, как показано в коде ниже:
#pragma once
template <typename ItemType>
class LinkedArrayList
{
private:
class Node {
ItemType* items;
Node* next;
Node* prev;
int capacity;
int size;
};
Node* head;
Node* tail;
int size;
public:
void insert (int index, const ItemType& item);
ItemType remove (int index);
int find (const ItemType& item);
};
теперь это не дает никаких ошибок или проблем. Тем не менее, создание функций в .cpp-файл дает мне ошибку "список аргументов для шаблона класса "LinkedArrayList" отсутствует."Он также говорит, что ItemType не определен. Вот код, очень простой, в .cpp:
#include "LinkedArrayList.h"
void LinkedArrayList::insert (int index, const ItemType& item)
{}
ItemType LinkedArrayList::remove (int index)
{return ItemType();}
int find (const ItemType& item)
{return -1;}
похоже, что это имеет какое-то отношение к шаблону, потому что, если я закомментирую его и изменю типы элементов в функциях на ints, это не даст никаких ошибок. Кроме того, если я просто сделаю весь код в .ч вместо отдельного .cpp, он отлично работает.
любая помощь по источнику проблемы была бы весьма признательна.
спасибо.
1 ответов
прежде всего, это то, как вы должны предоставить определение для функций-членов шаблона класса:
#include "LinkedArrayList.h"
template<typename ItemType>
void LinkedArrayList<ItemType>::insert (int index, const ItemType& item)
{}
template<typename ItemType>
ItemType LinkedArrayList<ItemType>::remove (int index)
{return ItemType();}
template<typename ItemType>
int LinkedArrayList<ItemType>::find (const ItemType& item)
{return -1;}
во-вторых, эти определения не могут быть помещены в .cpp
file, потому что компилятор не сможет создать их экземпляр неявно с точки вызова. См., например, это Q & A на StackOverflow.