2012-09-22 48 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工作! –