問題の単純なバージョン:
ライブラリ.h
typedef library::whatever::something::complicated X;
library.h をインクルードせずに X を前方宣言できますか?
基本的に私がやりたいことはこれです:
フー.h:
// forward declare X
void foo (const X &);
Bar.h :
#include <library>
typedef library::type<blah>::whatever Bar;
typedef Bar X;
Foo.cpp :
#include <Foo.h>
#include <Bar.h>
foo (const X &) {...
main.cpp :
#include <Foo.h>
#include <Bar.h>
foo (X ());
前提は、必要でない限り、含めたくないということです<library>
。他のヘッダーとの相互作用が悪いとしましょうが、これらの他のヘッダーはfoo
. ライブラリをインクルードせずに呼び出すことはできませんがfoo()
、それは .cpps が心配することです。
X を通常のクラス C に typedef したい場合は、C を前方宣言するだけで十分ですが、ここでは機能しません。
X を typedef として前方宣言することはできますが、私の知る限り、X の定義が既にある場合library::type<blah>
(そしておそらく blah の定義もある場合) に限られます。
前方宣言の要点は#include
、これらの型の定義ではないことです。
関連する問題は次のとおりです。
namespace std
{
template <typename T>
class vector;
}
typedef std :: vector <int> Buffer;
void foo (const Buffer &);
#include <vector> // ok until here
int main ()
{
foo (Buffer ());
}
この場合、std::vector の前方宣言は定義と互換性がありません。私が本当にしたくないふりをしましょう#include <vector>
(またはそれが何であれ、外部クラス)。
これを回避する方法はありますか?