2015-07-28 185 views
3

我使用鐺編譯使用C++ 14的方言我的代碼。看看下面的例子:構造與名稱衝突

class x 
{ 
    int _i; 

public: 

    x(int i) 
    { 
     this->_i = i; 
    } 
}; 

void x() 
{ 
} 

void f(class x my_x) 
{ 
    // Do something here 
} 

int main() 
{ 
    /* 
    f(x(33)); // Doesn't work 
    f(class x(33)); // Doesn't work 
    */ 

    // This works: 

    class x my_x(33); 
    f(my_x); 

    typedef class x __x; 
    f(__x(33)); 
} 

在這裏,我有一個名爲x他的名字的衝突與具有相同名稱的函數類。要區分x類和x函數,必須使用class標識符。這適用於所有情況,但我永遠無法找到一種方法直接調用x的構造函數。

在前面的例子,我想通過建立它在旅途中提供的功能fx對象。但是,如果我用f(x(33))它解釋爲一種病態的調用函數x,如果我用f(class x(33))它只是產生一個語法錯誤。

有很明顯的解決方法,但我想知道是否有什麼比使用臨時別名來定義類x或者顯式實例化一個會讓我煩惱的項目更優雅,因爲生活在調用函數的整個範圍內我只需要在函數調用中使用它。

也許有一個簡單的語法,我不知道呢?

+0

沒有太大的意義,並加上一個很好的問題,而是'的typedef class x __x;'由於x之前的雙下劃線而未定義。 – Bathsheba

+0

undefined是什麼意思?該代碼爲我編譯。我總是使用以雙下劃線開頭的類...我做錯了什麼? –

+3

請參閱http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier。有一個愉快的下午重構。 – Bathsheba

回答

9

所有你需要的是一對括號:

f((class x)(33)); 

或者更多的參數,也可以使用統一的初始化:

f((class x){1, 2, 3}); 
+0

耶!那很簡單。非常感謝! –

+0

哦。等待。但是,這隻適用於單參數構造函數。有沒有辦法讓這個工作在多個參數構造函數上呢? –

+0

@MatteoMonti作出'類x'一個typedef和使用投'T(A,B,C)' – 0x499602D2