使用模板typename初始化指针

pointer initialization with template typename

本文关键字:初始化 指针 typename      更新时间:2023-10-16

我已经从模板类继承了类。我想用模板参数初始化指针。我该怎么做呢?

Algorithm.h:

#ifndef ALGORITHM_H
#define ALGORITHM_H
#include <iostream>
using namespace std;
template <typename T>
class Algorithm
{
protected:
    T data;
    T result;  //(*)
    int dataSize;
    int resultSize;
public:
    Algorithm(){}
    Algorithm(T in, int inSize){
        cout<<"Algorithm constructor!"<<endl;
        data = in;
        dataSize = inSize;
        resultSize = dataSize;
        result = new T;    //(**)
        for (int i = 0; i<this->resultSize; i++){
            this->result[i] = 0;
            cout<<"i: "<<i<<" *(this->result+i) = "<<this->result[i]<<endl;
        }
    }
#endif // ALGORITHM_H

错误在(**)行:

/home/user/Projects/Algorithms/algorithm.h:23: error: cannot在赋值中将'float**'转换为'float*'result = new T;^

我可以改变行(*),但这不是我最喜欢的解决方案,因为它将与数据不一致-我宁愿这样。我如何初始化它让所有结果表都是0呢?

如果您不想将(*)行更改为T* result,那么您可以使用std::remove_pointer<>类型trait (c++ 11或更高版本)

result = new typename std::remove_pointer<T>::type(); // a single element value-initialized

或者(如果你想要一个数组,这可能就是你想要的)

result = new typename std::remove_pointer<T>::type [resultSize]; // array of resultSize elements

最后,您甚至可以将数组值初始化为

result = new typename std::remove_pointer<T>::type [resultSize]{}; // value-initialized array

然而,我发现这个解决方案很尴尬(至少可以说),如果你使用T* result来代替,可能会更清楚。