2011-12-13 21 views
3

親クラスの関数をC#で表示する方法を考え出すのは苦労しました。私がしようとすると、C++/CLI:テンプレートクラスから継承した関数はC#で表示されません

public ref class Vector3fP : public FixedNP<3, float> 
{ 
} 

は、その後、私はFixedNPテンプレートから継承したクラスをしました

template <int Dim, typename Type> 
public ref class FixedNP 
{ 
public: 
    float foo() {return 1;}; 
}; 

)私は、関数fooを定義するテンプレートクラスを、(きたと仮定しますC#からfoo()関数を呼び出します。

Vector3fP bar = new Vector3fP(); 
bar.foo(); 

関数Vector3fPにはfooの定義が含まれていないと表示されます。

foo()の定義をVector3fPクラスに移動すると、正常に動作します。しかし、これは実際のコードでは実行可能ではありません.FinalNPテンプレートには、およそ4つの異なるクラスから継承されるべき多くの関数が含まれているためです。

は、インターネット上のいくつかの検索後、私はVector3fPに

using FixedNP<3, float>::foo; 

を追加すると、誰かのために同様の問題が修正されていることが分かりました。しかし、私の場合にはそれだけで、別のエラーでC++/CLIのコードをコンパイル今回の結果:

エラーC3182:「Vector3fP」:メンバーusing宣言やアクセス宣言は、マネージ型

内違法です

私の機能をC#で見えるようにするにはどうすればよいですか?

+1

テンプレートに外部リンケージがありません。 C++ではなく、C++/CLIでもありません。 * generic *キーワードを使用する必要があります。 'int dim'は飛ばないでしょう。 http://msdn.microsoft.com/en-us/library/8z2kbc1y.aspx –

+0

私はそれを知っています。それがテンプレートから「通常の」クラスを継承する理由の1つです。 – stativ

+0

また、私はここでジェネリックスを望んでいないと確信しています。まずコンパイル時にこれを実行したい、次に私は実際にパラメータをintにする必要があります。これは後でテンプレートパラメータとして使用するためです。 – stativ

答えて

2

私は、彼らは鍵がManaged Templates on MSDNからこの主張であると思う:

テンプレートがインスタンス化されていない場合、それはメタデータに放出されていません。テンプレートがインスタンス化されると、参照されたメンバー関数のみがメタデータに表示されます。

つまり、C++コードで使用されていない関数は生成されたDLLには含まれず、C#からそれらを使用することはできません。この問題を解決するには、関数を参照するC++コードにphony関数を追加することができます。

void phony() 
{ 
    auto vec = gcnew Vector3fP(); 
    vec->foo(); 
} 
+0

ありがとう、これが助けになりました!どういうわけか私はドキュメントのその部分を逃した。私はこれが私に適切なテストスイートを作るように強制するだろうと思う。 – stativ