1

Je pense que ma question est simple et claire:Comment surcharger correctement la conversion de la classe de base pour hériter

Je classe de base AbstractMatrix, et la sous-classe de celui-ci Matrix, et je veux faire une conversion simple:

namespace mtrx { 
/* mycode */ 
    class AbstractMatrix { 
     public: 
     /* -//- */ 
     operator Matrix(); 
     /* -//- */ 
    } 
    class Matrix : public AbstractMatrix { 
    /* -//- */ 
    } 
} 

AbstractMatrix.cpp:

AbstractMatrix::operator Matrix(){ 
    return Matrix(data); 
} 
compilateur

donne un message:

Matrix.h:39:12: error: expected type-specifier before ‘Matrix’ 
    operator Matrix(); 
      ^

Qu'est-ce que je fais mal? Est-il possible de faire de telles conversions? Je pense que oui, parce que je veux juste faire le constructeur basé sur superclasse mais sans syntaxe ennuyeuse et je besoin implicite

Merci

+0

Je suis plus curieux de savoir pourquoi vous avez besoin de faire cela? Quel est le problème que l'opérateur est censé résoudre? Vous ne pouvez pas avoir une fonction "getter" virtuelle qui renvoie un pointeur "AbstractMatrix"? Ou peut-être utiliser [le CRTP] (https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) pour connaître la classe enfant? –

+2

En ce qui concerne votre problème, vous * savez * que les symboles doivent être déclarés (ou parfois même définis) * avant * d'utiliser les symboles? –

+0

par exemple pour foo (Matrice A); si je fais quelque chose comme ce foo (B) où B est AbstractMatrix, B serait conversé à la classe Matrix. Merci pour vos conseils, j'ai récemment commencé à apprendre le C++ et je vais vous parler des fonctions virtuelles et du CRTP, peut-être que ça va m'aider. – verganz

Répondre

5

Vous devriez simplement fournir une déclaration avant:

namespace mtrx { 

    class Matrix; // <=== here 

    class AbstractMatrix { 
     public: 
     operator Matrix(); 
    }; 

    class Matrix : public AbstractMatrix { 

    }; 

} 

pour rendre Matrix visible pour AbstractMatrix classe.


P.S. Vous devriez probablement reconsidérer votre conception, car avoir un opérateur de conversion pour convertir la classe de base en classe dérivée me semble bizarre.

+0

Oh, j'ai essayé de le faire au-dessus de l'espace de noms. A propos de la conception Oui, je pense que votre remarque est appropriée, mais il s'agissait plus de curieux de savoir pourquoi cela ne fonctionne pas – verganz