Bonjour à tous.

J'aimerai pouvoir faire du CRTP avec quelque chose d'assez particulier :
- les classes dérivées seront des classes template
- j'ai besoin que la classe de base connaisse les paramètres template des classes dérivées (je veux pouvoir travailler "normalement" avec ces types au sein de la classe de base)
- (EDIT) certaines fonctions de ma classe de base vont devoir renvoyer des choses du type TCRTP<T0, TDIM0>, c'est à dire des classes dérivées TCRTP avec d'autres paramètres template (T0, TDIM0 au lieu de T, TDIM) (voir vis à vis de l'exemple après)



Quelle est la bonne façon de concevoir une telle chose ?

J'ai essayé la chose suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
 
template<template<class T, unsigned int TDIM> class TCRTP> class NAbstract
{
    T _data[TDIM];
};
 
template<typename T, unsigned int TDIM> class NArray : NAbstract< NArray<T, TDIM> >
{
 
};
 
template<typename T, unsigned int TDIM> class NVector : NAbstract< NVector<T, TDIM> >
{
 
};
mais ça ne compile pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
main.cpp|5|error: 'T' does not name a type|
main.cpp|8|error: type/value mismatch at argument 1 in template parameter list for 'template<template<class T, unsigned int TDIM> class TCRTP> class NAbstract'|
main.cpp|8|error:   expected a class template, got 'NArray<T, TDIM>'|
main.cpp|13|error: type/value mismatch at argument 1 in template parameter list for 'template<template<class T, unsigned int TDIM> class TCRTP> class NAbstract'|
main.cpp|13|error:   expected a class template, got 'NVector<T, TDIM>'|
Merci beaucoup