2016-10-18 148 views
1

我真的不相信這個問題以前從未問過,但我真的試圖搜索沒有成功,如果你有一個已經回答了類似問題的鏈接,請分享。從C++移植到C++/CLI

我正在將C++/Win32程序移植到C++/CLI,當然,我正在嘗試減少代碼的修改次數,以加快重新測試階段的速度。

我有一些麻煩,由於有對象作爲參數,在這裏一個簡單的例子全局函數:

類的頭文件

namespace MyNamespace { 
    public ref class MyClass { 
    public: 
     void test(); 
    }; 
} 

類CPP文件

using MyNamespace; 

void myFunction(MyClass ^obj); 

void MyClass::test() { 
    myFunction(this); 
} 

問題在於:如果我從MyNamspace中刪除myFunction,它不能使用MyClass作爲參數的類型。如果我在MyNamespace中包含myFunction,則每個cpp文件都將正確編譯,但是我會得到一個鏈接器錯誤「LNK2028未解析的令牌」。

一個想法是定義一個新類,並將myFunction作爲一個公共靜態方法,但要做到這一點將是一項長期工作,因爲myFunction在真實項目中並不孤單......任何其他想法?

+0

你確定(實現)'myFunction'某處?如果這是「令牌」(符號,我認爲錯誤消息實際上是)未解決(請包括*完整*錯誤消息,無需編輯)。 –

+1

「命令行界面」標籤是愚蠢的CLI在「C++/CLI」代表「公共語言基礎設施」 – PeterT

+2

嗯,你只是寫了原型聲明來抑制編譯器錯誤消息,告訴你,你做錯了。然而,沒有阻止你做錯了,現在鏈接器發現你實際上並沒有這個功能。對於C++/CLI來說非常重要的是你不**直接將本地C++翻譯爲託管代碼,而只是將* public *接口的包裝類寫入到庫中。保留所有內部管道。並定製這些包裝,以便它們易於與託管型系統一起使用。 http://stackoverflow.com/a/2691448/17034。 –

回答

0

如果MyClassMyNamespacemyFunction是不是,你可以使用MyClass全名資格:

void myFunction(MyNamespace::MyClass ^obj); 

當然你myFunction應該在什麼地方實施。

+0

當然,它被執行,我做了一個錯誤的假設,它是顯而易見的。謝謝,我會嘗試並讓你知道。 – Beddu

+0

所以,我必須說它比我預期的更容易!將全局函數(myFunction)保留在名稱空間(MyNamespace)內並將原型包含在實現類方法(MyClass :: test)的cpp文件中就足夠了。然後在全局函數實現的cpp文件中,我必須告訴編譯器,我將使用來自命名空間的類(使用命名空間MyNamespace;),因此我不需要在每個聲明中指定它。我會用正確的代碼寫一個答案。 – Beddu

0

我提出以下尼基塔的建議一些測試,最後,工作,代碼如下:

類的頭文件

namespace MyNamespace { 
    public ref class MyClass { 
    public: 
     void test(); 
    }; 
} 

類CPP文件

void myFunction(MyClass ^obj); 

using MyNamespace; 

void MyClass::test() { 
    myFunction(this); 
} 

全局函數cpp文件

using namespace MyNamespace; 

void myFunction(MyClass ^obj) { 
    //do something 
} 

使用全局函數的CPP文件,這種做法是可以使用MyClass的同時myFunction的保持(或假裝留)全球性的,MyClass的::測試即使不在同一個命名空間訪問myFunction的,只是用原型聲明在「舊」C++中。