我试图编写一个模板化的基类来存储固定数量的数据类型,每个数据类型都有不同的长度。这是我尝试做的很多事情的简化版本:
template< int NINT, int NR0 >
class EncapsulatedObjectBase
{
public:
EncapsulatedObjectBase();
~EncapsulatedObjectBase();
double m_real[NR0];
int m_int[NINT];
}
是的......所以模板参数可以为零,从而声明一个零长度的对象数组。此基础将有多个派生类,每个派生类都定义自己的变量数量。我有两个问题:
1)这种方法是否存在根本缺陷?
2) 如果是这样...当我实例化一个零长度数组时,为什么 icc13 或 gcc4.7.2 不给我警告?对于 gcc,我使用 -wall 和 -wextra -wabi。没有警告让我认为这种事情还可以。
编辑:
这是显示我在说什么的文件的内容:
#include <iostream>
template< int NINT, int NR0 >
class EncapsulatedObjectBase
{
public:
EncapsulatedObjectBase(){}
~EncapsulatedObjectBase(){}
double m_real[NR0];
int m_int[NINT];
};
class DerivedDataObject1 : public EncapsulatedObjectBase<2,0>
{
public:
DerivedDataObject1(){}
~DerivedDataObject1(){}
inline int& intvar1() { return this->m_int[0]; }
inline int& intvar2() { return this->m_int[1]; }
};
class DerivedDataObject2 : public EncapsulatedObjectBase<0,2>
{
public:
DerivedDataObject2(){}
~DerivedDataObject2(){}
inline double& realvar1() { return this->m_real[0]; }
inline double& realvar2() { return this->m_real[1]; }
};
int main()
{
DerivedDataObject1 obj1;
DerivedDataObject2 obj2;
obj1.intvar1() = 12;
obj1.intvar2() = 5;
obj2.realvar1() = 1.0e5;
obj2.realvar2() = 1.0e6;
std::cout<<"obj1.intvar1() = "<<obj1.intvar1()<<std::endl;
std::cout<<"obj1.intvar2() = "<<obj1.intvar2()<<std::endl;
std::cout<<"obj2.realvar1() = "<<obj2.realvar1()<<std::endl;
std::cout<<"obj2.realvar2() = "<<obj2.realvar2()<<std::endl;
}
如果我用“g++ -Wall -Wextra -Wabi main.cpp”编译它,我不会收到任何警告。我必须使用 -pedantic 标志来获取警告。所以我仍然不知道这有多不安全。回想起来,我觉得它一定不是一个好主意……尽管如果我能侥幸逃脱它会非常有用。