5

次のコードが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

ネストされたテンプレート間で型を伝播できることを期待していましたAtomType…</p>

#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;
}
4

4 に答える 4

4

Distribテンプレートには次のものがありますtypedef

typedef typename SOLT::AtomType AtomType;

つまり、テンプレートパラメータとして渡すタイプはすべてAtomType、メンバーとしてが必要であり、doubleそのようなものはありません。

あなたがそのようなクラスを作ったなら

class Double
{
   typedef myType AtomType;
};

そしてそれをテンプレートパラメータとしてテンプレートに渡すと、存在するDistribようにコンパイルされます。Double::AtomType

于 2012-07-10T09:33:10.257 に答える
3

あなたのSamplerクラスでは、あなたは持っています:

typedef typename Distrib<AtomType>::Matrix Matrix;

ここにAtomTypeあるdoubleので、これは

typedef typename Distrib<double>::Matrix Matrix;

そして、あなたのDistribクラスでは、ライン

typedef typename SOLT::AtomType AtomType;

に拡大

typedef typename double::AtomType AtomType;

したがって、エラーメッセージ。Samplerクラスの行を次のようにしたいと思います。

typedef typename DT::Matrix Matrix;
于 2012-07-10T10:10:02.750 に答える
1

クラスのMatrixtypedefはを使用していますが、予想されるのは:です。DistribAtomTypeDT

typedef typename Distrib<DT>::Matrix Matrix;

コンパイラーは、doubleネストされたテンプレート間で伝播されるのを確認していました。

于 2012-07-10T09:50:00.500 に答える
1

DistribSolution;のタイプに基づいてテンプレート化されます。Sampler::Matrixしかし、あなたの定義ではAtomType、テンプレート引数として使用しています。おそらく、あなたはそのタイプが:Distribに関して提供されただけでいいのです。Sampler

template<typename DT>
class Sampler
{
    // ...
    typedef typename DT::Matrix Matrix;
};
于 2012-07-10T10:33:57.113 に答える