2016-12-31 54 views
0

我試圖寫一個C++的宏定義了一堆的子類的使用模板和顏色的名稱,像這樣:擁有與C++的宏麻煩

#define DECLARE_SET_ELEMENT(color) class ##color##SetElement : public SetElement { public: ##color##SetElement(std::string name); int getValue() override; }; 

,這樣我可以使用它像:

DECLARE_SET_ELEMENT(Blue) // -> class BlueSetElement ... 
DECLARE_SET_ELEMENT(Red) // -> class RedSetElement ... 
... 

但宏定義似乎沒有正常工作。它應該如何才能按照我的意圖工作?

+3

爲什麼你不使用模板?這實際上是他們的目的。 –

+0

是的,我們需要更多的上下文,但宏看起來像是一個奇怪的選擇。很可能,你寧願要從一個共同的基類繼承。 –

+0

它確實繼承了一個通用的基類,因此'class ...:public SetElement';) –

回答

3

使用

#define DECLARE_SET_ELEMENT(color) class color##SetElement : public SetElement { public: color##SetElement(std::string name); int getValue() override; }; 

代替。在這種情況下,導致##不適用。您不希望將class關鍵字與color結合使用。

+0

啊,我明白了。謝謝! :) –

+2

它比「領先的'##''沒有必要。絕對要求省略前導'##',因爲它將令牌'class'與顏色參數和'SetElement'組合在一起,導致完全破壞C++語法。 –

+2

謝謝你的建議!相應地更改了答案。 – user3684240