模板类中的数组定义

时间:2017-04-26 12:05:50

标签: c++ arrays templates

我已经生成了包含数据数组(一些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 ++中的类中创建模板化的非平凡数组?到目前为止,我只找到了模板类型为整数类型的示例。

3 个答案:

答案 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;
}