2009-06-30 47 views
14

我試圖用C++寫一個類,並且遇到了一個相當奇怪的問題:調用具有相同名稱的類內的外部函數作爲班級。它有點混亂,所以這裏有一個例子:C++ - 調用類中的函數名稱與類

void A(char* D) { 
    printf(D); 
} 

class A 
{ 
public: 
    A(int B); 
    void C(); 
}; 

A::A(int B) { 
    // something here 
} 

void A::C() { 
    A("Hello, World."); 
} 

編譯器會抱怨在倒數第二行,它不能找到一個函數A(字符*),因爲它是類裏面,構造具有與函數名稱相同。我可以寫以外其他功能,如:

ousideA(char* D) { 
    A(D); 
} 

然後調用outsideA A ::的C裏面,但是這似乎是一個愚蠢的問題的解決方案。任何人都知道更正確的方法來解決這個問題?

回答

35
::A("Hello, world."); 

應該可以正常工作。基本上,它說:「使用全局命名空間中發現的A

2

我建議你使用命名空間。將你的類放在與函數不同的命名空間中。

namespace my_namespace1 
{ 

void A() {} 

} 

namespace my_namespace2 
{ 

struct A {}; 

} 


int main() 
{ 
    my_namespace1::A(); 
    my_namespace2::A my_a;  
} 

當然,真正的問題是,爲什麼你有一個類和一個不同名稱的函數?一個簡單的規則是使類名爲WithBeginningCapitalLetter,而不使用One的函數。那麼你永遠不會有這個問題。當然,STL不這樣做...