0

我正在尝试编写 GSL 集成例程的小型 C++ 重新实现作为学习 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’”

最好的

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 回答