如何使用模板类型初始化成员变量数组?

时间:2014-03-10 20:44:55

标签: c++ arrays templates declaration

如何在构造函数s中初始化模板类型T的数组Stack()?这可能是一个非常简单的问题,但我对c ++知之甚少。我在编译时遇到这个错误(GNU GCC):

  

错误:将'double *'赋值为'double [0]'

时出现不兼容的类型

这就是我在Stack中初始化main.cpp对象的方式:

Stack<double> stack;

这是我的Stack.h文件(包括实现):

#pragma once
#include <iostream>

using namespace std;

template <class T>

class Stack
{
    public:
        Stack();

    private:
        T s[];
        int N;
};

template <class T>

Stack<T>::Stack() {
    s = new T[5];
}

3 个答案:

答案 0 :(得分:2)

更改

//...
private:
    T s[];

//...
private:
    T *s;

此声明

private:
    T s[];

不符合C ++。数组的大小应该是一个常量表达式。此外,您声明了一个数组,但在构造函数

中将其用作指针
s = new T[5];

或使用std::vector代替手动分配的数组。

答案 1 :(得分:0)

首先,必须在编译时知道放在堆栈上的数组的大小,所以

T s[];

shoud读取例如

T s[10];

第二个T数组是不同的类型,然后T*返回new

解决方案:

class Stack
{
    public:
        Stack();
        ~Stack() { delete[] s_;}  // to avoid memory leak delete the array

    private:
        T* s;
        int N;
};

template <class T>
Stack<T>::Stack() {
    s = new T[10];
}

用法:

int main() {
    Stack<int> s;
    return 0;
}

更好的是,将数组的大小设为模板参数:

template <class T, size_t N>
class Stack
{
    public:
        Stack();
        ~Stack() { delete[] s_;}  // to avoid memory leak delete the array

    private:
        T* s_;
        int N_;
};

template <class T, size_t N>
Stack<T,N>::Stack() : N_( N) {
    s_ = new T[N_];
}

用法:

int main() {
    Stack< int,10> s;
    return 0;
}

更好

使用模板,使标准容器成为模板参数:

template <class T, size_t N, template<class T, 
                                           class = std::allocator<T> > class C >
class Stack
{
    public:
        Stack();
        ~Stack() {}

    private:
        C<T> s_;
        int N_;
};

template <class T, size_t N, template<class T, 
                                           class = std::allocator<T> > class C >
Stack<T,N,C>::Stack() : N_( N) {
    s_.resize( N_);
}

用法:

int main() {
    Stack< int,10,std::vector > s;
    return 0;
}

答案 2 :(得分:0)

另一种方法是将数组大小赋予所谓的非类型模板参数(我假设N代表当前堆栈大小,我假设):

template <class T, int size>
class Stack
{
    public:
        Stack() : N(0) {}

    private:
        T s[size];
        int N;
};

您可以按如下方式使用它:

Stack<double, 5> myStack;
相关问题