2017-01-24 1 views
0

Je modifie un code existant dans un projet. J'ai un Param modèle de classe et une classe de modèle spécialisé partielle pour les paramètres dans un fichier d'en-tête comme ci-dessous:Le pointeur vers un type de classe incomplet n'est pas autorisé dans une classe de modèles partielle

template<class ValueType> 
struct Param 
{ 
    static void add(ParameterCode code, ValueType value, ParameterAttributes attributes) 
    { 
    } 

    static PreSetResultType preSetActions(ParameterCode code, ValueType& value) 
    { 
     return (SUCCESS); 
    } 

    static void set(ParameterCode code, ValueType value) 
    { 
    } 

    static ValueType get(ParameterCode code) 
    { 
     ValueType value = ValueType(); 
     return (value); 
    } 

    static void serialize(ParameterCode code, vector<uint8_t>& byteArray) 
    { 
    } 

    static ValueType deserialize(const vector<uint8_t>& byteArray) 
    { 
     return (*reinterpret_cast<const ValueType*>(byteArray.begin())); 
    } 
}; 

/* template function specialization for pointer types */ 
template<class ValueType> 
struct Param<ValueType*> 
{ 
    static void add(ParameterCode code, ValueType* value, ParameterAttributes attributes) 
    { 
    } 

    static PreSetResultType preSetActions(ParameterCode code, ValueType*& config) 
    { 
     return (SUCCESS); 
    } 

    static void set(ParameterCode code, ValueType* pObjNew) 
    { 
     pObjNew->serialize(serializedObject); //error line 54 
    } 

    static ValueType* get(ParameterCode code) 
    { 
     void* value = NULL; 
     return ((ValueType*)value); 
    } 

    static void serialize(ParameterCode code, vector<uint8_t>& byteArray) 
    { 
     ValueType* obj = get(code); 
     obj->serialize(byteArray); //error line 60 
    } 

    static ValueType* deserialize(const vector<uint8_t>& byteArray) 
    { 
     return (ValueType::deserialize(byteArray)); //error line 65 
    } 
}; 

dans la spécialisation de la classe de modèle que je reçois ce message d'erreur: « type incomplet n'est pas autorisé Parameters.h "à la ligne: 65 " pointeur vers le type de classe incomplet n'est pas autorisé Paramètres.h "à la ligne: 54 et 60

Je sais que la spécialisation de la classe de modèle a un type incomplet mais le compilateur devrait le résoudre au moment de la compilation ou ai-je besoin d'une sorte de déclaration avancée? Les deux classes sont dans le même fichier .h. Seul le code correspondant est copié ici. Merci pour votre aide.

+1

quelles lignes sont 54,60 et 65? Qu'avez-vous modifié? Cela fonctionnait-il avant? – user463035818

+0

Le code fonctionnait avant et je viens de supprimer l'inclusion de certains fichiers d'en-tête qui n'étaient pas nécessaires pour mon projet. Les lignes ont été mentionnées maintenant dans le code. – masterop

+0

avant qu'il ne fonctionne, vous avez supprimé certains inclut, maintenant il ne fonctionne pas. Pourquoi pensez-vous toujours que ces inclusions ne sont pas nécessaires? – user463035818

Répondre

1

Vous avez probablement oublié d'inclure un fichier d'en-tête avec la définition d'une classe de paramètres quelque part. C'est la cause la plus fréquente de l'erreur.

La déclaration forward fonctionne lorsque vous n'utilisez pas les champs de la classe déclarée. Une fois que vous commencez à utiliser des champs, vous avez besoin d'une définition de cette classe.

+0

Le problème était qu'ailleurs, j'instanciait un objet de ce modèle avec une classe qui n'était pas disponible en raison de la suppression des fichiers d'en-tête. J'ai donc supprimé cette partie du code. Le problème était que le compilateur ne se plaignait pas là :) – masterop