2010-03-13 58 views
0
public ref class ScriptEditor : public Form 
{ 
public: 
    typedef map<UInt32, ScriptEditor^>     AlMap; 
    static AlMap          AllocationMap; 

    Form^            EditorForm;  
    RichTextBox^          EditorBox; 
    StatusBar^           EditorStatusBar; 
    StatusBarPanel^          StatusBarLineNo; 

    void            Destroy() { EditorForm->Close(); } 
                 ScriptEditor(unsigned int PosX, unsigned int PosY); 
}; 

上述代碼引發錯誤C2039:'{dtor}':不是'System :: IDisposable'的成員。查看了解釋CLR如何管理內存的文章後,我完全迷失了方向。任何意見,擺脫它將不勝感激。我在C+++/CLI中的第一次嘗試不太順利。System :: IDisposable woes

回答

1

您沒有收到非常好的錯誤消息。但問題是STL地圖模板類只適用於非託管類型。它需要一個元素類型有一個析構函數,託管類型沒有一個。在C++/CLI語言中,析構函數使用IDisposable接口進行模擬,這是您看到的令人困惑的錯誤消息的來源。

如果您確實想使用STL,您可以使用VS2008中的STL/CLR implementation。然而,它被廣泛忽視,因爲它基本上將STL(昂貴的價值語義)與託管代碼(引用類型上沒有默認值語義)的缺點結合起來。 This web page將它與本地.NET集合類進行比較,結果很輕描淡寫。

合適的集合類,這裏用的是System::Collections::Generic::Dictionary<>

+0

我使用的地圖容器的CLR實現 - 必須有提到前面。無論如何,我會嘗試使用Dictionary類。 – shadeMe 2010-03-13 16:53:42

+0

那麼,在鏈接文檔中有很好的描述,STL/CLR需要ScriptEditor來實現〜ScriptEditor()。但是,使用Dictionary <>。 – 2010-03-13 17:10:04

+0

再一次,我沒有完整地發佈完整的代碼,因此我有錯。我確實在一點實現了析構函數,但是錯誤信息仍然存在。 – shadeMe 2010-03-14 01:39:06