2015-12-04 60 views
-1

我有用oldSyntax編寫的這個舊項目。它在VS2012中工作得很好,但我發現在VS2015/clr中:oldSyntax不再可用,我期待的是,我有很多錯誤。 我設法擺脫他們中的一些,但現在我擋在這行代碼:將舊的Managed-C++項目轉換爲新的C++/CLI

ref class myColumnItemSorterClass : public IComparer 
    { 
     int IComparer::Compare(Object^ x, Object^ y) 
     { 
      if (x && y) { 
       ColumnItemType^ pSSx = dynamic_cast<ColumnItemType^>(x); 
       ColumnItemType^ pSSy = dynamic_cast<ColumnItemType^>(y); 

       if (pSSx->Position&&pSSx->Position->Length>0 && 
        pSSy->Position&&pSSy->Position->Length>0) { 

        int xPos = Convert::ToInt32(pSSx->Position); 
        int yPos = Convert::ToInt32(pSSy->Position); 

        if (xPos < yPos) { 
         return -1; 
        } else if (xPos > yPos) { 
         return 1; 
        } else { 
         return 0; 
        } 
       } else { 
        return 0; 
       } 

      } else { 
       return 0; 
      } 
     } 
    }; 

有2個錯誤:

  1. 在myColumnItemSorterClass - >類無法實現接口成員函數 「系統::收藏集:: IComparer的比較::」(宣佈在「C:\ NETFramework \ V4.0 \ mscorlib.dll中)

  2. 在比較 - >合格的名字是不允許

任何想法如何解決它們?

回答

2

一個重寫接口的方法必須virtualpublic,和可以sealed防止派生類從重新執行該方法。

不要使用接口名稱來限定方法(例如:IComparer::Compare)。編譯器會將其解釋爲定義顯式覆蓋失敗的嘗試(請參閱編譯器錯誤C3253)。

ref class myColumnItemSorterClass : IComparer 
{ 
public: 
    virtual int Compare(Object^ x, Object^ y) 
    { 
     /*...*/ 
     return 0; 
    } 
}; 

如果你想重寫的方法只能通過接口句柄可以訪問,您可以使用explicit overriding。重寫的方法必須仍然virtual,但可以private應該sealed

ref class myColumnItemSorterClass : IComparer 
{ 
private: 
    virtual int CompareExplicit(Object^ x, Object^ y) sealed = IComparer::Compare 
    { 
     /*...*/ 
     return 0; 
    } 
}; 
+0

謝謝你的回答! – cosmotel