我已經用C++編寫了一個與clang ++編譯的程序,但不是用g ++編譯的,我想理解爲什麼。在該類聲明中的STL容器控制類
的重要組成部分是:
class Table {
private:
...
std::unordered_map<std::string,Table> table_map;
...
};
我認爲的std :: unordered_map會使用指針「引擎蓋下」,所以,這是合法的。我沒有在Table中聲明一個Table,但是我創建了一個容器,它有一個指向Table內的Table的指針。或者我想。鏗鏘聲++沒有問題,程序運行良好。
但是,g ++抱怨這個,說「note: forward declaration of 'class Table'
」。這表明我應該明確地讓std :: unordered_map採取一個指針(std::unordered_map<std::string,Table*>
,或者可能有些智能指針的味道)。這需要我做一些額外的工作(而且我正在處理一年前寫的代碼,所以我不急於弄清楚爲了做出必要的更改而做了什麼)。
這是g ++中的一個bug還是clang ++做了一些聰明的事情,這不是標準的一部分?有沒有更好的方法來重寫這段代碼,以便在clang ++和g ++上編譯?
我有另一個名爲Value的類,並且表中有一個std :: unordered_map值,所以我可以通過創建一個超類元素來解決此問題,Value和Table都從中繼承,然後讓表包含std::unordered_map<std::string,Element>
?或者,這樣的地圖無法存儲值和表,因爲它是爲元素聲明的?
有對'的std :: VECTOR',標準計劃的容器庫: :list'和'std :: forward_list'來支持不完整的類型,但不支持'std :: unordered_map'。也許Boost的地圖支持它。 – chris