我已经生成了包含数据数组(一些const静态,一些是可变的)和访问器方法的配置文件。问题是现在其中一种数据类型将被模板化,但我根本无法使编译器接受它。
模板化类型是非pod,但默认是可构造的。
使用的定义可以在cpp文件中,但由于在生成代码时我不知道模板化类型,我不能再这样做了。
即。我想要类似下面的东西(如果我可以,但在标题之外的定义更好)
template<typename T>
class LargeConfig :
{
public:
// methods
private:
static const POD1 POD_ONES[];
T ManyTs[];
};
template<typename T>
static const POD1 LargeConfig<T>::POD_ONES[] =
{
{ 0U, 1U}, // instance 1
{ 1U, 1U}, // instance 2
...
};
template<typename T>
T LargeConfig<T>::ManyTs[] =
{
T(), // instance 1
T(), // instance 2
...
};
目前我得到&#34; 这里可能没有指定存储类&#34;对于 POD_ONES 定义和&#34; 非静态数据成员可能无法在其类别之外定义&#34;对于 ManyTs 。
但是肯定必须有一些方法在c ++中的类中创建模板化的非平凡数组?到目前为止,我只找到了模板类型为整数类型的示例。
答案 0 :(得分:1)
首先,ManyTs
未声明为static
,因此错误为nonstatic data member defined outside of class
。
然后,在定义static
成员时,请不要设置关键字static
:
template<typename T>
class LargeConfig
{
public:
// methods
private:
static const POD1 POD_ONES[];
static T ManyTs[];
};
template<typename T>
const POD1 LargeConfig<T>::POD_ONES[] =
{
{ 0U, 1U}, // instance 1
{ 1U, 1U}, // instance 2
};
template<typename T>
T LargeConfig<T>::ManyTs[] =
{
T(), // instance 1
T() // instance 2
};
我编译了一个sample demo(将您的static
数据成员公开以便快速访问它们)
答案 1 :(得分:1)
正如你自己所说,你有两个问题,让我从第二个开始。
ManyTs
被定义为LargeConfig的常规成员,这意味着它应该在类的构造函数中初始化。一个例子:
template<typename T>
LargeConfig<T>::LargeConfig()
: ManyTs
{ T(), // instance 1
T(), // instance 2
...
}
{}
第一个问题更难以猜测,因为我设法使用以下POD1定义编译它
struct POD1
{
POD1(unsigned, unsigned);
unsigned _1{};
unsigned _2{};
};
我怀疑你要么不包括这个班级,要么其他东西出错了,但是,因为我们看不到它,所以很难说。
答案 2 :(得分:0)
尝试在这里编译你的代码(g ++ 5.4)我在第7行遇到了语法错误。纠正我们得到:
templates.cpp:16:44: error: ‘static’ may not be used when defining (as opposed to declaring) a static data member [-fpermissive]
static const POD1 LargeConfig<T>::POD_ONES[] =
^
templates.cpp:23:26: error: ‘T LargeConfig<T>::ManyTs []’ is not a static data member of ‘class LargeConfig<T>’
T LargeConfig<T>::ManyTs[] =
^
templates.cpp:23:26: error: template definition of non-template ‘T LargeConfig<T>::ManyTs []’
第一条消息与this problem有关。您不能使用静态来定义数据类型,仅用于声明。
通过简单地将ManyTs
成员设为静态来纠正上一个错误。
然后代码变成这样:
class POD1 {
};
template<typename T>
class LargeConfig
{
public:
// methods
private:
static const POD1 POD_ONES[];
static T ManyTs[];
T ManyTsAgain[10];
};
template<typename T>
const POD1 LargeConfig<T>::POD_ONES[] =
{
{ 0U, 1U}, // instance 1
{ 1U, 1U}, // instance 2
};
template<typename T>
T LargeConfig<T>::ManyTs[] =
{
T(), // instance 1
T(), // instance 2
};
int main() {
LargeConfig<int> obj1;
LargeConfig<POD1> obj2;
return 0;
}