2017-04-26 65 views
1

我已经用数据数组(一些常量静态,一些可变)和访问器方法生成了配置文件。问题是,现在有一种数据类型将被模板化,但我无法让编译器接受它。模板类中的数组定义

模板类型是非pod,但默认可构造。

使用的定义是在cpp文件中,但由于我不知道模板类型,而代码正在生成,我不能再这样做了。

I.e.我想类似如下(如果我能更好,但头外面的定义)

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 
    ... 
}; 

目前我得到“存储类可能不会在这里指定”为POD_ONES定义和“非静态数据成员可能不会在其类之外定义为“ManyTs”。

但肯定有一定的方法来创建模板化的非平凡的数组在c + +中的类?到目前为止,我只找到了模板类型是整数类型的例子。

+0

'POD1'在范围内吗?只要定义了错误,我就不会收到错误。 – NathanOliver

+0

@NathanOliver:恩。非常感谢。在更改代码时,我创建了静态POD结构const的一个成员。显然,这导致我的嵌入式编译器将它视为非POD并给出了上面的错误消息。没有const成员,POD_ONES部分就可以工作。 – Troels

回答

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数据成员)

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; 
} 
1

正如自己所指出的,你有2个问题,让我先从第二个。

ManyTs被定义为LargeConfig的常规成员,这意味着它应该在您的类的构造函数中初始化。举个例子:

template<typename T> 
LargeConfig<T>::LargeConfig() 
: ManyTs 
    { T(), // instance 1 
     T(), // instance 2 
     ... 
    } 
{} 

的第一个问题是很难猜测,因为我设法与下面术后第一天

struct POD1 
{ 
    POD1(unsigned, unsigned); 
    unsigned _1{}; 
    unsigned _2{}; 
}; 

的定义编译它我怀疑你要么不包括的类或某事尽管如此,其他人对这个班级也是错误的,因为我们看不到它,所以很难说。