4 votes

CRTP avec classe de base essayant d'obtenir le type de retour d'un membre de la classe dérivée: utilisation invalide d'un type incomplet

Considérez le code suivant (il n'est donné qu'à titre d'exemple) :

#include 
#include 
#include 

template <
class Crtp, 
class Vector = typename std::decay().data())>::type, 
class Scalar = typename std::decay().data(0))>::type
>
struct Base
{;};

template <
class Vector = std::array, 
class Scalar = typename std::decay()[0])>::type
>
struct Derived
: public Base>
{
    Vector _data;
    inline Vector& data() {return _data;}
    inline const Vector& data() const {return _data;}
    inline Scalar& data(const unsigned int i) {return _data[i];}
    inline const Scalar& data(const unsigned int i) const {return _data[i];}
};

int main()
{
    Derived<> d;
    return 0;
}

Il retourne l'erreur suivante :

main.cpp: In instantiation of 'struct Derived<>':
main.cpp:28:14: required from here
main.cpp:16:8: error: invalid use of incomplete type 'struct Derived<>'
main.cpp:16:8: error: declaration of 'struct Derived<>'

Y a-t-il un moyen de résoudre ce problème (sans utiliser de typedefs et uniquement des templates) ?

1voto

Casey Points 18217

C'est plutôt désordonné, car Derived n'est pas complet lorsque la déduction des arguments de modèle se produit pour Base. Je suppose que la réponse évidente - passer Vector et Scalar explicitement - est insatisfaisante. Et si on faisait plutôt :

template

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X