使用模板typename初始化指针

时间:2015-05-30 18:44:24

标签: c++ templates

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

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:错误:不能   转换&#39;浮动**&#39;到&#39;浮动*&#39;在任务中            结果=新T;                   ^

我可以改变行(*),但它不是我最喜欢的解决方案,因为它会与数据不一致 - 我宁愿这样做。那么我怎样才能初始化它以感觉所有结果表为0?

1 个答案:

答案 0 :(得分:3)

如果您不想将(*)行更改为T* result,则可以使用std::remove_pointer<>类型特征(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,可能会更清楚。