模板参数无效(唯一指针)

Posted

技术标签:

【中文标题】模板参数无效(唯一指针)【英文标题】:Template arguments are invalid (unique pointer) 【发布时间】:2015-08-26 08:05:43 【问题描述】:

我正在尝试创建一个可动态调整大小的 N 维数组类。我的模板类有签名ndarray<typename data_type, int dimensions>。为了保存数组,我想使用一个唯一的指针类成员来保存类型为模板化的向量 std::vector<type_t> 用于 1D,std::vector<std::vector<type_t>> 用于 2D,std::vector<std::vector<std::vector<type_t>>> 用于 3d 等...

唯一指针将根据维数具有不同的签名。我想让 ndarray 的类构造函数设置唯一指针的签名并使用 new 创建新向量,但我需要将 auto 成员变量设置为成员变量类型的向量这是行不通的。我目前的方法是使用一个模板函数,它返回数组需要的类型的对象,template<typename data_type> auto dimension_helper(int dimensions),然后像这样设置唯一的指针签名std::unique_ptr<decltype(<data_type>dimension_helper(dimens))> array。这也不起作用,给我错误模板参数 1 无效,模板参数 2 在唯一指针内无效。

我可以做些什么来使我现有的代码正常工作,或者有没有更好的方法以类似的方式解决问题?

代码示例

标题

#ifndef ND_H_
#define ND_H_
#include <cstring>
#include <vector>
#include <memory>


namespace NdArray
    //use the following for dimension types 
    template<typename T>
    using d1 = std::vector<T>;
    template<typename T>
    using d2 = std::vector<d1<T>>;
    template<typename T>
    using d3 = std::vector<d2<T>>;
    template<typename T>
    using d4 = std::vector<d3<T>>;
    template<typename T>
    using d5 = std::vector<d4<T>>;

    template<typename data_type>
    auto dimension_helper(int dim);



    template<typename data_type,int dimensions>
    class ndarray
            int dims;
            std::unique_ptr<std::vector<int>> xsub_spans;

        public:
            ndarray();
            ~ndarray();
            std::unique_ptr<decltype(<data_type>dimension_helper(dimensions))> array;

            template<typename dat_type, int dim>
            friend std::ostream& operator<<(std::ostream& , ndarray<dat_type, dim>&);
    ;




#endif

到目前为止的定义

#include "nd.h" 
using namespace NdArray;

template<typename data_type, int dimensions>
ndarray<data_type, dimensions>::ndarray()
    dims = dimensions;
    array = new <data_type>dimension_helper(dimensions); 


template<typename data_type>
auto dimension_helper()
    switch (dims) 
        case 1 : 
            d1<data_type> type;
            return type;
            break;
        
        case 2 : 
            d2<data_type> type;
            return type;
            break;
        
        case 3 : 
            d3<data_type> type;
            return type;
            break;
        
        case 4 : 
            d4<data_type> type;
            return type;
            break;
        
        case 5 : 
            d5<data_type> type;
            return type;
            break;
        
    

【问题讨论】:

模板参数列表出现在模板名称之后,所以dimension_helper&lt;data_type&gt;(dimensions)而不是&lt;data_type&gt;dimension_helper(dimensions) 我做了这些改动,只是让我的编译器更加疯狂哈哈。 [error] 在扣除 auto 和 [error] 'class std::unique_ptr>' [OT]:dims = dimensions;是多余的,dimensionsarray的范围内可以访问 【参考方案1】:

模板参数列表位于模板名称之后,因此:

dimension_helper<data_type>(dimensions)

而不是

<data_type>dimension_helper(dimensions)

但是,您的“维度助手”没有机会工作,因为 switch 语句是运行时分支,并且由于 return 语句中的表达式类型不相等而无法编译。相反,您可以将其重写如下:

template <typename T>
struct identity  using type = T; ;    
template <typename T, std::size_t D>
struct dimension_helper : identity<std::vector<typename dimension_helper<T, D-1>::type>> ;
template <typename T>
struct dimension_helper<T, 0> : identity<T> ;
template <typename T, std::size_t D>
using dimension_helper_t = typename dimension_helper<T, D>::type;

并将您的指针声明为:

std::unique_ptr<dimension_helper_t<data_type, dimensions>> array;

DEMO

【讨论】:

好吧,这有点道理。我将不得不仔细研究一下,以弄清楚你在那里做了什么。但是谢谢你:)

以上是关于模板参数无效(唯一指针)的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 从客户端代码中隐藏模板参数

为啥这个嵌套的可变参数模板是无效参数?

将 lambda 作为模板参数传递给函数指针函数模板化

将模板化智能指针类型作为模板参数传递

没有参数列表的模板名称“ ”的使用无效

c++向量模板参数1无效