2016-03-03 13 views
8

次のモジュール考えてみましょう。それを使用してC++モジュールでテンプレート内の非エクスポート機能を使用して

module M; 

// a private, non-exporting function 
int id(int x) { 
    return x; 
} 

export 
template <class T> 
int f(T x) { 
    return id(0); 
} 

export 
int g(int y) { 
    return id(1); 
} 

そして、次のC++コード:

import M; 

int main() { 
    g(42); 
    return 0; 
} 

をそれは成功し、VS2015のアップデート1でコンパイルして動作しますgfに置き換えた場合、コンパイラはerror C3861: 'id': identifier not foundという文句を言います。

修正方法?

+0

モジュールの正しいフラグに従っていますか?私はIDE自体からはうまくいかないと思う。 – paulm

答えて

3

この問題は、テンプレートのインスタンス化ルールのために発生します。 C++ヘッダーファイルにテンプレート定義を組み込むのと同じ理由で(別々の.cppファイルでテンプレート定義を定義しない)、テンプレート関数をこのようにモジュールからエクスポートすることはできません。

テンプレート関数またはクラスをモジュールからエクスポートすることは、このモジュール内で使用される可能性のあるすべてのインスタンス化を持つことをお勧めしません。しかし、何らかの理由でこのように実装したい場合は、モジュール内のintとしてTを使って関数f()をインスタンス化する必要があります。このモジュール内で整数引数を持つ無用な呼び出しを追加してください。

+0

このような振る舞いの理由ははっきりしている。不明な点はテンプレート関数をどのようにエクスポートするかということだ。インスタンス化の時点で表示されている関数/変数のみを使用する必要がありますか? –

+0

Ignat、私は問題を解決する方法の詳細について私の答えを更新しました。 – CodeFuller

+0

しかし、 "このモジュール内でおそらく使用されるすべてのインスタンス化を持たなければならない"場合、 'id(0)'を '0'に置き換えても機能しませんでした。 –

関連する問題