我有一个这样的课程:
/* ClassA.h */
class ClassA{
public:
static const size_t SIZE = 10;
int array[SIZE];
funcA();
funcB();
...
};
而且,在另一个cpp文件中,有如下代码:
min(ClassA::SIZE, other_variable);
但是,我无法构建此代码,并且出现如下错误(在Mac OS X中最新的cc,Apple LLVM 4.2(clang-425.0.28))
Undefined symbols "ClassA::SIZE" ...
可能是因为“SIZE”在头文件中定义并且可以像宏一样使用,ClassA.o不包含“SIZE”作为符号。同时,在“min”模板中使用时,引用代码以某种方式需要符号。 (我可以通过'nm'命令检查ClassA.o不包含“SIZE”符号,但是引用代码的目标文件包含“SIZE”符号。)
ClassA.o可以通过在ClassA.cpp中定义文字编号来包含“SIZE”符号,如下所示:
const int ClassA::SIZE = 10;
但是在这种情况下,由于在头文件中定义了一个数组,因此会出现另一个错误,如下所示。
error: fields must have a constant size: 'variable length array in structure' extension will never be supported
原始代码适用于某些较旧的编译器(LLVM 4.0)。 有什么好主意可以解决这种情况吗?
答案 0 :(得分:5)
您需要为ClassA::SIZE
提供定义,但仍然在声明时给出常量整数值:
/* ClassA.h */
class ClassA{
public:
static const size_t SIZE = 10; // value here
int array[SIZE];
funcA();
funcB();
...
};
/* ClassA.cpp */
const size_t ClassA::SIZE; // no value here
答案 1 :(得分:1)
/* ClassA.h */
class ClassA{
public:
static const size_t SIZE = 10;
int array[SIZE];
funcA();
funcB();
...
};
const size_t ClassA::SIZE;
这应该有效。
答案 2 :(得分:0)
为什么不使用枚举?,你可以在静态方法中将数组定义为静态变量(所以一切都在头文件中)
class ClassA {
public:
enum {SIZE=10;};
static int *array() { static int arr[SIZE]; return arr; }
};