2012-03-24 131 views
2

可能重複:
Scoped using-directive within a struct/class declaration?
Why 「using namespace X;」 is not allowed inside class/struct level?爲什麼我不能在C++結構體中使用命名空間指令?

我想向大家介紹只的std :: string到結構。 爲什麼下面被認爲是非法的?

#include <iostream> 
#include <string> 

struct Father 
{ 
    using std::string; 

    string sons[20]; 
    string daughters[20]; 
}; 

但奇怪的是,我可以做一個函數繼

int main() 
{ 
    using std::string; 
} 

更新:C++使用具有不同的語義相同的關鍵字。

C++使用關鍵字「using」將數據成員或函數從基類引入當前類。因此,當我寫一個struct聲明中使用std :: string時,編譯器假定我試圖從基類std中引入一個成員。但std不是基類,而是一個命名空間。 因此

struct A 
{ 
    int i; 
} 

struct B:A 
{ 
    using A::i; // legal 
    using std::string// illegal, because ::std is not a class 
} 

相同的「使用」關鍵字也用於訪問特定的命名空間的成員。

所以,我猜編譯器根據聲明的位置決定「使用」的語義。

+2

請**不要**在編輯問題時刪除自動插入的「可能重複」鏈接。我知道你更新了,以解釋爲什麼你認爲它不是*建議問題的重複,這是完全可以接受/鼓勵的行爲。但是,您應該讓您的編輯碰到問題並吸引注意列表中的用戶重新公開投票,或者使用「標誌」鏈接要求版主根據您的更新檢查並重新打開投票。刪除自動插入的鏈接是非常不鼓勵的;系統將在重新打開時將其刪除。 – 2012-03-25 08:01:17

+0

(如果在這種情況下刪除它是一個意外 - 即,您的編輯時間相撞 - 然後我爲嚴厲的聲音道歉,請將它作爲未來的好建議!:-)) – 2012-03-25 08:02:35

回答

2

我不知道答案,你的實際問題,但你可以使用一個typedef:

struct Father 
{ 
    typedef std::string string; 

    string sons[20]; 
    string daughters[20]; 
}; 
0

它只是沒有被不幸的是,語言允許的,但有一個變通方法:

namespace Father_Local 
{ 
    using std::string; 

    struct Father 
    { 
     //... 
    }; 
} 

using Father_Local::Father; 

這種方法的優點是你可以原則上編寫一個使用指令,例如

using namespace boost::multi_index; 

那裏,並保存在頭文件中的打字和雜亂的負載。這些都不影響其餘的代碼 - 父進程通過使用在最後被導入到它的適當的命名空間,一切正常。

相關問題