如何将std :: array转换为类类型

时间:2017-08-20 08:08:14

标签: c++ c++11

我有下面的代码,我需要通过模板化的类创建一个对象数组。模板化的类将接收另一个类作为其类型:

#include <iostream>
#include <array>
class B
{
    public:
    B() {std::cout << "B Called" <<std::endl;}
    B(int y){std::cout << "B int Called" <<std::endl;}
    static const int mysize;
};
const int B::mysize = 256;

template <typename anotherclass>
class A : public anotherclass
{
    public:
    A(){std::cout << "Called" << std::endl;}
    static anotherclass* obj[anotherclass::mysize];
    //static anotherclass[] init();
    static std::array<anotherclass*,anotherclass::mysize> init();
};

template <typename anotherclass>
std::array<anotherclass*, anotherclass::mysize> A<anotherclass>::init ()
{
    std::array<anotherclass*,256> objtemp[anotherclass::mysize];
     for (int i = 0 ; i < anotherclass::mysize; i++)
    { objtemp[i] = new anotherclass(2); }
    return  objtemp;
}
//A<B> obj[256] = [] () {for (int i = 0 ; i < 256; i++) { obj[i] = new A<B>(2)}};
template <typename anotherclass>
anotherclass* A<anotherclass>::obj[anotherclass:: mysize] = A<anotherclass>::init();

int main()
{
    A<B> a;
}

当我经常遇到错误时 -

could not convert ‘objtemp’ from ‘A<B> [256]’ to ‘std::array<B, 256ul>
conversion from ‘std::array<B, 256ul>’ to non-scalar type ‘A<B>’ requested

我将objtemp更改为std :: array并且错误消失但我得到了以下错误 -

   32:1 error: need ‘typename’ before ‘A<anotherclass>::obj’ because ‘A<anotherclass>’ is a dependent scope
     A<anotherclass>::obj = A<anotherclass>::init();

我不确定这个错误意味着什么?

我得到了实际修复:

template <typename anotherclass>
anotherclass A<anotherclass>::obj[anotherclass:: mysize] = A<anotherclass>::init();

但下面是我收到的输出:

B Called
Called

我期待B&#39;构造函数被调用256次以下语句的原因

objtemp[i] = new anotherclass(2) 

据我所知,因为我需要创建256个B类对象,所以它的构造函数应该被调用256次,这在我的情况下是不会发生的。那么在我的情况下,我该如何初始化一个静态的对象数组 -

 template <typename anotherclass>
anotherclass A<anotherclass>::obj[anotherclass:: mysize] = A<anotherclass>::init();

上面的代码是错误的还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

请记住您是否要使用C风格的数组或std::array。后者似乎是一个更好的选择,因为无法复制 C风格的数组 你正在使用C ++ (11)。

所以将objtempobj声明为std::array s。