2012-09-22 175 views
0

我試圖編寫一個小的C++重新實現GSL集成例程作爲一個實踐項目來學習C++元編程。我有以下問題。模板參數向量::構造函數

我已經定義了一些類型的特性(使程序與雙浮筒和工作兩者)

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' 沒有一個參數列表」

最好

+0

你真的需要一個特質讓你回到'T'和'T()'嗎?這看起來像是完全矯枉過正......'alist(size)'會有完全相同的行爲。 –

回答

1

zero是一個值,而不是一個類型!你需要這個:

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

現在你可以使用GslIntegrationWorkspace<double>::zero,等等。你當然會只需要alist(size, zero)構造。

如果您不使用ODR值(例如,獲取其地址),您甚至不需要爲其定義 - 內聯聲明和初始化就足夠了。

+0

感謝您對「static constexpr ft zero = AT :: zero;」的建議。 –

1

你需要實現這樣的構造函數:

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

定義GslIntegrationWorkspace當你的信息也少了一種class

+0

缺失的類是這裏的拼寫錯誤 –

+0

謝謝......第一個建議(GslIntegrationWorkspace )並且沒有typename工作! –

相關問題