web-dev-qa-db-fra.com

La liste d'arguments pour le modèle de classe est manquante

J'ai un problème curieux et je ne sais pas trop quel est le problème. Je crée une classe appelée LinkedArrayList qui utilise un modèle de nom de type, comme indiqué dans le code ci-dessous:

#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);
};

Maintenant, cela ne donne aucune erreur ou problème. Cependant, la création des fonctions dans le fichier .cpp me donne l'erreur "La liste d'arguments pour le modèle de classe 'LinkedArrayList' est manquante." Il indique également que ItemType n'est pas défini. Voici le code, très simple, dans le .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;}

Il semble que cela ait quelque chose à voir avec le modèle, car si je le commente et modifie les ItemTypes dans les fonctions en ints, cela ne donne aucune erreur. De plus, si je fais juste tout le code dans le .h au lieu d'avoir un .cpp séparé, cela fonctionne très bien aussi.

Toute aide sur la source du problème serait grandement appréciée.

Merci.

17
user2146215

Tout d'abord, voici comment vous devez fournir une définition des fonctions membres d'un modèle de classe:

#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;}

Deuxièmement, ces définitions ne peuvent pas être mises dans un .cpp fichier, car le compilateur ne pourra pas les instancier implicitement à partir de leur point d'invocation. Voir, par exemple, ce Q&A sur StackOverflow .

18
Andy Prowl