suite de morceau de code ne compile pas, le problème est dans T::rank
pas être inaccessible (je pense) ou non initialisé dans le modèle parent.C++ CRTP (modèle de modèle) question
Pouvez-vous me dire exactement quel est le problème? passe le rang explicitement le seul moyen? ou existe-t-il un moyen d'interroger la classe tensorielle directement?
Merci
#include <boost/utility/enable_if.hpp>
template<class T, // size_t N,
class enable = void>
struct tensor_operator;
// template<class T, size_t N>
template<class T>
struct tensor_operator<T, typename boost::enable_if_c< T::rank == 4>::type > {
tensor_operator(T &tensor) : tensor_(tensor) {}
T& operator()(int i,int j,int k,int l) {
return tensor_.layout.element_at(i, j, k, l);
}
T &tensor_;
};
template<size_t N, typename T = double>
// struct tensor : tensor_operator<tensor<N,T>, N> {
struct tensor : tensor_operator<tensor<N,T> > {
static const size_t rank = N;
};
tensor <4> D; // compiler attempts to instantiate undefined template, not specialization
Je sais que la solution de contournement, mais suis intéressé par la mécanique du modèle instanciation pour l'auto-éducation
Pourrait-il être lié à ce bug que j'ai trouvé dans Visual Studio? http://connect.microsoft.com/VisualStudio/feedback/details/354162/seemingly-valid-dependant-types-in-nested-template-not-accepted –
@kirill g ++ 4.3. J'ai oublié d'ajouter la dernière ligne avec l'instanciation, corrigé maintenant – Anycorn
@evan ça ressemble effectivement à – Anycorn