0

C++ メタプログラミングを学ぶための練習プロジェクトとして、GSL 統合ルーチンの小さな C++ 再実装をコーディングしようとしています。次の質問があります。

いくつかの型特性を定義しました (プログラムが double と float の両方で動作するようにするため)

template<typename T> class IntegrationWorkspaceTraits;

template<> class IntegrationWorkspaceTraits<double>
{
     public:
     typedef double ft; //float_type
     static constexpr ft zero = 0.0;
}; 

template<> class IntegrationWorkspaceTraits<float>
{
    public:
    typedef float ft; //float_type
    static constexpr ft zero = 0.0f;
}; 

そして今、私はこのような特性を使用するクラスを持っています

template< typename T, typename AT = IntegrationWorkspaceTraits<T> >    GslIntegrationWorkspace
{
    typedef typename AT::ft   ft;
    typedef typename AT::zero zero;

    public:
    GslIntegrationWorkspace(size_t size);

    private:
    typename std::vector<ft> alist;
}

私の質問は: メンバー ベクトルの初期値を設定するために、特性で定義されているゼロ定数を使用する方法です。私の推測は次のようなものです

template<typename T, typename AT> 
GslIntegrationWorkspace::GslIntegrationWorkspace( size_t size ):
alist(size, typename AT::zero),   
{};

しかし、コンパイラ g++ は「gsl_integration.h:63:42: エラー: 引数リストなしのテンプレート名 'GslIntegrationWorkspace' の無効な使用」と不平を言います

一番

4

2 に答える 2

1

zero型ではなく値です! あなたはこれを必要とします:

typedef typename AT::ft ft;
static constexpr ft     zero = AT::zero;

などを使用できるようGslIntegrationWorkspace<double>::zeroになりました。コンストラクターでは、もちろん が必要alist(size, zero)です。

値を ODR で使用しない場合 (たとえば、そのアドレスを取得する場合)、値の定義さえ必要ありません。インライン宣言と初期化で十分です。

于 2012-09-22T23:43:49.563 に答える
1

次のようにコンストラクターを実装する必要があります。

template<typename T, typename AT> 
GslIntegrationWorkspace<T, AT>::GslIntegrationWorkspace( size_t size ):
    alist(size, AT::zero),   
{
}

classを定義するときに投稿にも a がありませんでしたGslIntegrationWorkspace

于 2012-09-22T23:45:45.943 に答える