我正在尝试编写一个小的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'而没有参数列表”
最好的
答案 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
。