1

我有这样的课:

/* 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)中工作。解决这种情况有什么好主意吗?

4

3 回答 3

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
于 2013-05-30T09:48:40.460 回答
1
/* ClassA.h */
class ClassA{
public:
  static const size_t SIZE = 10;
  int array[SIZE];
  funcA();
  funcB();
  ...
};
const size_t ClassA::SIZE;

那应该行得通。

于 2013-05-30T09:48:11.967 回答
0

为什么不使用枚举?,您可以将数组定义为静态方法中的静态变量(所以一切都在头文件中)

class ClassA {
    public:
    enum {SIZE=10;};
    static int *array() { static int arr[SIZE]; return arr; }
};
于 2013-05-30T09:49:39.823 回答