Je templated suis en utilisant C++ et je suis en train de créer une classe basé sur un modèle (une pile). Je voudrais définir le constructeur de copie et l'opérateur d'affectation.je reçois « pas de fonction de membre déclaré en classe » erreur sur mon constructeur de copie quand je compile une classe
sont clairement définis dans l'en-tête, puis je les mettre en œuvre dans le fichier cpp.
Voici les problèmes que je reçois: - Pour le constructeur de copie: prototype pour 'Stack :: Stack (const Stack &)' ne correspond pas à la classe 'Stack' - Pour l'opérateur assignement: pile .cpp: 28: erreur: non 'Stack & Stack :: operator = (const Stack &)' fonction membre déclarée dans la classe 'Stack' - Pour le constructeur: stack.cpp: 4: erreur: le candidat est: Stack: : Stack()
Voici le fichier d'en-tête:
// stack.hpp
#ifndef STACK_HPP
#define STACK_HPP
#include <stdio.h>
#include <assert.h>
template <class T>
class Stack
{
public:
Stack();
~Stack();
Stack(const Stack&);
Stack& operator=(const Stack&);
private:
T* v_;
size_t vsize_;
size_t vused_;
};
Voici le fichier cpp:
// stack.cpp
#include "stack.hpp"
template <class T>
Stack<T>::Stack() :
v_(0),
vsize_(10),
vused_(0)
{
v_ = new T[vsize_];
}
template <class T>
Stack<T>::~Stack()
{
delete[] v_;
}
// Stack(const Stack&);
template <class T> Stack<T>::Stack(const Stack<T>& other) :
v_(NewCopy(other.v, other.vsize_, other.vsize_)),
vsize_(other.vsize_),
vuser_(other.vused)
{
}
// Stack& operator=(const Stack&);
template<class T> Stack<T>& Stack<T>::operator=(const Stack<T>& other)
{
if (this != &other)
{
T* v_new = NewCopy(other.v_, other.vsize_, other.vsize__;
delvete v_;
v_ = v_new
vsize_ = other.vsize_;
vused_ = other.vused_;
}
return *this
}
Une dernière chose, voici le journal de la compilation:
g++ -c stack.cpp -o stack.o
stack.cpp:20: error: prototype for ‘Stack<T>::Stack(const Stack<T>&)’ does not match any in class ‘Stack<T>’
stack.cpp:4: error: candidate is: Stack<T>::Stack()
stack.cpp:28: error: no ‘Stack<T>& Stack<T>::operator=(const Stack<T>&)’ member function declared in class ‘Stack<T>’
Je suis sûr que ce soit seulement une petite erreur de faute de frappe, mais je ne peux pas semble le trouver. Merci pour votre aide
Merci! Je ne le savais pas. Je l'ai changé et après correction de quelques erreurs cela fonctionne. Donc, si je comprends bien, il n'y a aucun moyen de séparer les en-têtes et la mise en œuvre d'une classe modélisée? Peut-être en utilisant une interface? – Arthur
Oui, vous pouvez utiliser l'héritage avec vos modèles et les forcer tous à hériter d'une classe de base commune (la pile et la pile héritent toutes les deux de IStack). Cela peut être plutôt utile. –
séparation fonctionne bien, et le code tel que présenté devrait avoir compilé je pense (n'a pas détecté de bug). Si vous connaissez à l'avance les types que vous utiliserez pour instancier, vous pouvez instancier explicitement dans le fichier .cpp et ne pas utiliser le code. Mais normalement, vous aurez la définition d'un modèle dans le même fichier que la déclaration de modèle elle-même, y compris toutes ses fonctions membres. –