C++ C++;-在嵌套模板实例化中调用非默认构造函数

C++ C++;-在嵌套模板实例化中调用非默认构造函数,c++,C++,我目前正在为FreeCell实现实例化一组卡片。每个数组、堆栈和卡片类都是我创建的,堆栈和数组类都是模板化的 Array<StackRA<Card>> * hometemp = new Array<StackRA<Card>>(4); Array*hometemp=新数组(4); 当这段代码运行时,它会按预期实例化大小为4的数组,但会调用堆栈上的默认构造函数,我需要将其实例化为大小为13 我尝试了以下方法: Array<StackRA&l

我目前正在为FreeCell实现实例化一组卡片。每个数组、堆栈和卡片类都是我创建的,堆栈和数组类都是模板化的

Array<StackRA<Card>> * hometemp = new Array<StackRA<Card>>(4);
Array*hometemp=新数组(4);
当这段代码运行时,它会按预期实例化大小为4的数组,但会调用堆栈上的默认构造函数,我需要将其实例化为大小为13

我尝试了以下方法:

Array<StackRA<Card>> * hometemp = new Array<StackRA<Card>(13)>(4)
Array<StackRA<Card>> * hometemp = new Array<StackRA<Card>13>(4)
Array*hometemp=新数组(4)
阵列*hometemp=新阵列(4)
堆栈的默认构造函数如下所示:

template <typename T>
StackRA<T>::StackRA() : m_stack()
{
    size = 0;
}
模板
StackRA::StackRA():m_stack()
{
尺寸=0;
}
以及我要调用的1参数构造函数

template <typename T>
StackRA<T>::StackRA( int data ) : m_stack( data )
{
    size = data;
}
模板
StackRA::StackRA(int数据):m_堆栈(数据)
{
大小=数据;
}
我在Google上试过运气,但它一直引导我找到模板类中模板的资源。任何想法都很感激

编辑:进入我的程序将导致数组构造函数

template<class T>
Array<T>::Array(int length, int start_index)
{
    if (length < 0)
    {
        cout << "Length cannot be negative, length has been defaulted to 0\n";
        m_length = 0;
    }
    else
    {
        m_length = length;
        m_start_index = start_index;
        m_array = new T[length];
    }
}
模板
数组::数组(int-length,int-start\u索引)
{
如果(长度<0)
{

您的
数组中是否有什么特殊的东西,所以您不能使用
std::vector
?对于
std::vector
,您可以简单地说

std::vector<StackRA<Card>> * hometemp =
    new std::vector<StackRA<Card>>(4, StackRA<Card>(13));


如果您坚持自己的实现,您可能需要考虑一些想法。

首先,如果
Array
表示一个数组,并且要像一个数组一样使用,那么您不需要创建指针。您可以将其构造为自动对象:

Array<StackRA<Card>> hometemp(4);
这是真的,将调用默认构造函数,将每个构造函数初始化为
T()
。在C++11之前,无法使用不同的构造函数初始化每个元素,但现在可以使用初始值设定项列表进行初始化:

m_array = new T[length] { T(13), T(13), ... };
当然,对于可变大小的数组(或大小非常大的数组)来说,这并不可取,也不是出于我们的目的。相反,您可以遵循
std::vector
的行为,创建另一个构造函数,将对象复制到数组中的每个元素:

m_array = new T[length];
template <typename T>
StackRA<T>::StackRA(int size, const T& obj) : size(size), m_stack(/* ... */)
{
    m_array = new T[size];
    std::fill(m_array, m_array + size, obj);
}
模板
StackRA::StackRA(int size,const T&obj):size(size),m_堆栈(/*…*/)
{
m_数组=新的T[大小];
std::fill(m_数组,m_数组+大小,obj);
}
现在,在构造数组时,可以传递正确的构造函数:

Array<StackRA<Card>> hometemp(4, StackRA<Card>(13));
Array hometemp(4,StackRA(13));

最后一行,您的意思必须是
数组hometemp(4,StackRA(13));
Array<StackRA<Card>> hometemp(4);
m_array = new T[length];
m_array = new T[length] { T(13), T(13), ... };
template <typename T>
StackRA<T>::StackRA(int size, const T& obj) : size(size), m_stack(/* ... */)
{
    m_array = new T[size];
    std::fill(m_array, m_array + size, obj);
}
Array<StackRA<Card>> hometemp(4, StackRA<Card>(13));