2013-05-30 38 views
1

我有這樣一個類:在C++中定義靜態常量變量

/* 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,蘋果LLVM 4.2(鐺-425.0.28))

Undefined symbols "ClassA::SIZE" ... 

很可能是因爲 「大小」 是德在頭文件中被罰款並且可以像宏一樣使用,ClassA.o不包含「SIZE」作爲符號。同時,在「min」模板內使用代碼時,需要符號。 (我可以通過'nm'命令檢查ClassA.o不包含「SIZE」符號,但引用代碼的目標文件包含「SIZE」符號。)

ClassA.o可以通過定義文字「SIZE」像在ClassA.cpp數以下:

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)中工作。 解決這種情況的好主意?

+1

你使用命名空間嗎?如果需要,您可能需要添加名稱空間。 – Djon

+0

我有一個非常類似的問題,但與C,而不是C++。我還發現,'gcc'在它的目標文件中保留了'static const'變量。 (可能不適用於你的情況?) 我在這裏發佈問題/答案之前做了更多研究。 –

回答

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
/* ClassA.h */ 
class ClassA{ 
public: 
    static const size_t SIZE = 10; 
    int array[SIZE]; 
    funcA(); 
    funcB(); 
    ... 
}; 
const size_t ClassA::SIZE; 

這應該工作。

+0

const數據成員可以定義 - 類 –

+0

修正了這個問題。謝謝。 – Hassedev

0

爲什麼不使用一個枚舉?你可以定義數組作爲一個靜態變量一個靜態方法(所以一切都在頭文件中)

class ClassA { 
    public: 
    enum {SIZE=10;}; 
    static int *array() { static int arr[SIZE]; return arr; } 
};