C++ typedef with nested templates is not a class, struct, or union type
c++, templates, typedef, typename
Solution
In your `Sampler` class, you have:
typedef typename Distrib<AtomType>::Matrix Matrix;
Here, `AtomType` is `double`, so this is
typedef typename Distrib<double>::Matrix Matrix;
And then in your `Distrib` class, the line
typedef typename SOLT::AtomType AtomType;
expands to
typedef typename double::AtomType AtomType;
Hence the error message. I think you want the line in the `Sampler` class to be:
typedef typename DT::Matrix Matrix;
Problem
I'm not sure to understand why the following code is not compiled with g++: ``` t.cpp: In instantiation of ‘Distrib<double>’: t.cpp:28:56: instantiated from ‘Sampler<Distrib<Solution<double> > >’ t.cpp:35:48: instantiated from here t.cpp:16:45: erreur: ‘double’ is not a class, struct, or union type t.cpp:18:43: erreur: ‘double’ is not a class, struct, or union type ``` I was expecting to be able to propagate the `AtomType` type across the nested templates… ``` #include <iostream> #include <vector> template<typename T> class Solution { public: typedef T AtomType; }; template<typename SOLT> class Distrib { public: typedef typename SOLT::AtomType AtomType; typedef std::vector<AtomType> Matrix; Matrix matrix; }; template<typename DT> class Sampler { public: typedef typename DT::AtomType AtomType; typedef typename Distrib<AtomType>::Matrix Matrix; Matrix matrix; }; int main() { Sampler< Distrib< Solution<double> > > sampler; } ```