2014-10-01 48 views
4

類的初始化列表我已經看到了其中一個叫類成員變量minmaxC++與「分」成員

class A 
{ 
public: 
A(); 
~A(); 
bool min; 
bool max; 
... 
}; 

與構造

A::A() 
{ 
    min=false; 
    max=true; 
    ... 
} 

我試圖與重寫一遍初始化列表的使用:

A::A():min(false), max(true){} 

但我收到ñ警告+錯誤

warning C4003: not enough actual parameters for macro 'min' 
error C2059: syntax error : ')' 

因爲min宏在WinDef.h

定義是否可以使用初始化列表在這種情況下,沒有成員變量的重命名?

+0

@edtheprogrammerguy編號:'錯誤C2059:語法錯誤:「this'' – Peter 2014-10-01 13:27:38

+8

查找NOMINMAX – 2014-10-01 13:28:01

+1

@edtheprogrammerguy:在C++中,它會'這個 - >'但是這仍然表達式的一部分,並且初始化程序列表包含不是epxressions的成員。 – MSalters 2014-10-01 13:29:27

回答

5

如果你有VS2013或其他現代編譯:

A():min {false}, max {true} { } 

避免了問題,因爲min(a,b)是一個函數式宏{無法啓動參數列表。

這是特定於初始化列表,所以我重新打開了這個問題。在表達上下文中使用「重複」建議的地址宏,這在根本上是不同的 - 您可以在那裏使用(min)

1

根據你的情況,你有幾個選擇。

  1. 使用大括號初始化由@MSalters的建議

  2. 定義NOMINMAX您包括窗口前的頭文件,以避免被定義minmax宏。這將取決於代碼的大小以及對它的控制程度。

  3. 只是#undef宏。只在源文件中推薦。

  4. 使用MSVC預處理器指令來保存,undef然後恢復宏。是這樣的...

    #pragma push_macro("min") 
    #undef min 
    /* use min here */ 
    #pragma pop_macro("min") 
    
+0

定義'NOMINMAX'的不利之處在於其他來源可能會期望'min'和'max'存在。 – 2014-10-01 13:53:33

+0

@MikeDeSimone是的,使用'#undef'也是如此,你必須小心謹慎,你可以在後面編譯代碼。 – Lionel 2014-10-01 13:59:01

+1

@MikeDeSimone:這可能是通過進一步'使用std :: min;使用std :: max'。代碼依賴'min'和'max'爲宏是很少見的。 – MSalters 2014-10-02 07:11:08