2010-05-19 8 views
3

A ont une hiérarchie de classes qui ressemble somethign comme ceci:Renvoi d'un C++ référence dans une fonction membre const

class AbstractDataType { 
public: 
    virtual int getInfo() = 0; 
}; 

class DataType: public AbstractDataType { 
public: 
    virtual int getInfo() { }; 
}; 

class Accessor { 
    DataType data; 
public: 
    const AbstractDataType& getData() const { 
     return(data); 
    } 
}; 

Eh bien, GCC 4.4 Rapports:

En fonction membre « const AbstractDataType & accesseurs :: getData() const ': erreur: initialisation invalide de la référence de type' const AbstractDataType & 'à partir de l'expression de type' const DataType '

Où suis-je mal - est-ce que thi s un cas où je DOIT utiliser un pointeur?

[modifier - fixe des points-virgules]

+0

Je ne vois rien de mal avec ce code, et Comeau et Visual C++ 2010 l'acceptent tous les deux (avec des changements triviaux pour le compiler). –

+0

Fonctionne avec g ++ 4.4.1 – sth

+0

Fonctionne sur g ++ 4.2.4 (modulo les points-virgules manquants dans vos règles de classe) – Stephen

Répondre

4

Non, vous n'avez pas besoin d'utiliser un pointeur. Vous pouvez utiliser une référence ou un pointeur de la même manière dans ce cas.

Le code que vous avez collé doit fonctionner et fonctionne dans g ++ 4.4 et Visual Studio 2010 .... autre que les points-virgules manquants après les déclarations de classe.

Je suppose que votre code ne correspond peut-être pas exactement au code que vous compilez.

En particulier avez-vous accidentellement fait cela dans le code?

class DataType /*: public AbstractDataType*/ { 
public: 
    virtual int getInfo() { }; 
}; 
+1

Oui, j'ai effectivement oublié d'hériter de AbstractDataType. Jeez, quelle erreur de débutant. : -/ –

+0

@Chris: arrive à tout le monde une fois ou l'autre –

0

Je n'ai pas une copie de GCC pour tester, mais le problème est peut-être la parenthèse autour des données. Le compilateur peut interpréter cela comme une expression de type DataType, que vous ne pouvez pas affecter à une référence. Essayez:

return data; 
Questions connexes