2016-10-18 19 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をパラメータの型として使用することはできません。 myFunctionをMyNamespaceに含めると、すべてのcppファイルが正しくコンパイルされますが、リンカーエラー "LNK2028未解決トークン"が表示されます。

アイデアは、新しいクラスを定義し、myFunctionをパブリック静的メソッドとして含めることですが、実際のプロジェクトでmyFunctionが単独ではないので、これは長い仕事になります。 MyNamespacemyFunctionではないにMyClassがある場合

+0

どこかで 'myFunction'を定義(実装)していますか?それが解決されていない "トークン"(実際にはエラーメッセージだと思う)の場合(編集しないで*完全な*エラーメッセージを含めてください)。 –

+1

"コマンドラインインターフェイス"タグが愚かである "C++/CLI"のCLIは "共通言語インフラストラクチャ"の略である – PeterT

+2

あなたは間違っていると言ったコンパイラエラーメッセージを抑制するプロトタイプ宣言を書きました。しかし、あなたがそれを間違ってやってしまうのをやめさせていませんでしたが、リンカはあなたが実際にその機能を持っていないことを発見しました。C++/CLIには、ネイティブC++をマネージコードに直接変換するのではなく、*あなたのライブラリへの*パブリック*インターフェイス用のラッパークラスを書くだけです。すべての内部配管をそのままの状態にしておきます。これらのラッパーをカスタマイズして、管理対象タイプのシステムで使いやすくします。 http://stackoverflow.com/a/2691448/17034 –

答えて

0

、あなたはフルネーム資格と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ファイルグローバル関数のCPPファイルにこのアプローチを使用

using namespace MyNamespace; 

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

はMyFunctionのは、残っている(または維持するふり)しながら、MyClassのを使用することが可能であるグローバル、およびMyClassの::テストは、同じ名前空間であってもいないのMyFunctionにアクセスすることができ、ちょうど使用して"古い" C++のようなプロトタイプ宣言。

関連する問題