通常、C++ではクラス間の依存関係が必要なときに、ヘッダーファイルで前方宣言を使用し、両方のヘッダーファイルを各cppファイルに含めます。C++で相互依存型テンプレートを宣言/定義する方法は?
ただし、テンプレートを使用して作業する場合、この方法は壊れます。テンプレートは完全にヘッダファイルに入っている必要があります(コードをcppに入れ、のそれぞれについてtemplate class A<T>;
を列挙した場合はカウントされません)。T
がラムダの場合など、常に実現可能なわけではありません。
C++で相互依存するテンプレートを宣言/定義する方法はありますか?
コード例
template<typename T> struct B;
template<typename T> struct A {
void RunA(B<T> *pB) {
// need to do something to B here
}
};
template<typename T> struct B {
void RunB(A<T> *pA) {
// need to do something to A here
}
};
私はRunA()
でB
に何かをやって起動した場合、私はBの唯一の前方宣言がコンパイルされた時間RunA()
によって提供されていますので、私は「行方不明の定義」エラーを取得すると思います。
おそらく、ヘッダーファイルを整理するためのいくつかのトリックがあります。各ヘッダをクラス定義ファイルとメソッド定義ファイルに分割し、それらをいくつかの素晴らしい方法で含めることによって、または、何かが第3 /第4クラスを介して行われるかもしれません。しかし、私はこれを具体的に行う方法を想像することはできません。
C++ 11/14/17はokです(具体的には、MSVC++ 2017、toolset v141)。
VS15には3つの異なるコンパイラバージョンをインストールすることができるため、コンパイラの年を記載する代わりにバージョンを記載してください(以前のものはすべて1つしかありません)。 – tambre
@ SergeyB。これは、私が与えたコード例の特定の問題を解決します。しかし、私は、 ".hと.cppファイルを持たず、関数定義を含む.inlのような第3の種類のファイルが必要なテンプレートを持つ"の代わりに、どのように管理するかについての一般的なガイドラインが必要です。 ... –
おそらくあなたは、メンバメソッド関数テンプレートを作成し、 '好きstatic_assert'を通じてタイプを強制することができます:'テンプレート<テンプレートクラスC> 無効RUNA(C の* pB { static_assert(STD :: is_same 、B > ::値、 "!"); // ... } '。この方法では、コールポイントで 'B'の定義だけが必要です。それはあなたのために働くことができますか? –
skypjack