vector :: Template的模板参数

时间:2012-09-22 23:41:56

标签: c++ templates c++11

我正在尝试编写一个小的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;
}

我的问题是:如何使用在traits上定义的零常量来设置成员向量的初始值。我的猜测就像是

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

但编译器g ++抱怨“gsl_integration.h:63:42:错误:无法使用模板名称'GslIntegrationWorkspace'而没有参数列表”

最好的

2 个答案:

答案 0 :(得分:1)

zero是一个值,而不是一个类型!你需要这个:

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

现在您可以使用GslIntegrationWorkspace<double>::zero等。在构造函数中,您当然只需要alist(size, zero)

如果你不使用ODR(例如取其地址),你甚至不需要为它定义 - 内联声明和初始化就足够了。

答案 1 :(得分:1)

你需要像这样实现你的构造函数:

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

在定义class时,您的帖子也遗漏了GslIntegrationWorkspace