我有下面的代码,我需要通过模板化的类创建一个对象数组。模板化的类将接收另一个类作为其类型:
#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();
上面的代码是错误的还是我错过了什么?
答案 0 :(得分:0)
请记住您是否要使用C风格的数组或std::array
。后者似乎是一个更好的选择,因为无法复制 C风格的数组 你正在使用C ++ (11)。
所以将objtemp
和obj
声明为std::array
s。