2

おおよそ次のようなテンプレートのインスタンス化のマクロ定義があります。

#define INSTANTIATE_TEMPLATE(typeName) \
  template FooBarImpl<C##typeName>;

したがって、実際にはあまり機能しません。次に、このマクロを大量に呼び出します。

INSTANTIATE_TEMPLATE(OneType)
INSTANTIATE_TEMPLATE(AnotherType)
INSTANTIATE_TEMPLATE(TypeThree)

など...これはうまくいくようです。これらの最後の行のみを含むインスタンス化のインクルードを作成しようとし、行を次のように置き換えました

#include "instantiations.hpp"

ただし、この新しいバージョンはコンパイルされません。テンプレートがインスタンス化されているとき、ファイルの上部にあるすべてのインクルードが見えないようです。

MS ドキュメントの引用:

#include ディレクティブは、指定されたファイルの内容を、ディレクティブが出現する時点でソース プログラムに出現したかのように処理するようにプリプロセッサに指示します。

したがって、これは、#includes とマクロがプリプロセッサによって評価される方法に伴う、ある種の順序付けの問題であると思います。しかし、実際にはどのように機能し、何が起こっているのでしょうか?

4

3 に答える 3

0

を定義した後に含める必要がありますINSTANTIATE_TEMPLATE

于 2013-10-16T12:58:40.483 に答える