vector::构造函数的模板参数 我试图把一个小的C++重新实现GSL集成例程作为一个实践项目来学习C++元编程。我有以下问题

vector::构造函数的模板参数 我试图把一个小的C++重新实现GSL集成例程作为一个实践项目来学习C++元编程。我有以下问题,c++,templates,c++11,C++,Templates,C++11,我定义了一些类型特征(使程序能够同时使用double和float) 模板类集成WorkspaceTraits; 模板类集成WorkspaceTraits { 公众: typedef double ft;//浮点型 静态constexpr ft zero=0.0; }; 模板类集成WorkspaceTraits { 公众: typedef float ft;//float\u类型 静态constexpr ft零=0.0f; }; 现在我有了一个类,它使用了这样的特性 template<

我定义了一些类型特征(使程序能够同时使用double和float)

模板类集成WorkspaceTraits;
模板类集成WorkspaceTraits
{
公众:
typedef double ft;//浮点型
静态constexpr ft zero=0.0;
}; 
模板类集成WorkspaceTraits
{
公众:
typedef float ft;//float\u类型
静态constexpr ft零=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;
}
templateGslIntegrationWorkspace
{
typedef typename AT::ft;
typedef typename AT::zero;
公众:
GSL集成工作空间(大小);
私人:
std::向量列表;
}
我的问题是:如何使用特征上定义的零常量来设置成员向量的初始值。我猜是这样的

template<typename T, typename AT> 
GslIntegrationWorkspace::GslIntegrationWorkspace( size_t size ):
alist(size, typename AT::zero),   
{};
模板
GslIntegrationWorkspace::GslIntegrationWorkspace(大小):
列表(大小、类型名称为::零),
{};
但编译器g++抱怨“gsl_integration.h:63:42:错误:在没有参数列表的情况下,模板名“GslIntegrationWorkspace”的使用无效”


最佳

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

typedef typename AT::ft ft;
static constexpr ft     zero = AT::zero;
现在您可以在构造函数中使用
GslIntegrationWorkspace::zero
等。当然,您只需要
alist(size,zero)


如果您不使用ODR值(例如,获取其地址),您甚至不需要对其进行定义-内联声明和初始化就足够了。

您需要实现如下构造函数:

template<typename T, typename AT> 
GslIntegrationWorkspace<T, AT>::GslIntegrationWorkspace( size_t size ):
    alist(size, AT::zero),   
{
}
模板
GslIntegrationWorkspace::GslIntegrationWorkspace(大小):
alist(大小,在::0处),
{
}

在定义
GslIntegrationWorkspace

时,您的帖子也缺少一个
,您真的需要一个特质来回报
T
T()
?这看起来像是彻底的过度杀戮<代码>列表(大小)将具有完全相同的行为。此处缺少的类是一个输入错误谢谢…第一个建议(GslIntegrationWorkspace)没有typename就行了!感谢您对“static constexpr ft zero=AT::zero;”的建议
template<typename T, typename AT> 
GslIntegrationWorkspace<T, AT>::GslIntegrationWorkspace( size_t size ):
    alist(size, AT::zero),   
{
}