1

問題の単純なバージョン:

ライブラリ.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>(またはそれが何であれ、外部クラス)。

これを回避する方法はありますか?

4

2 に答える 2

1

i think it's hard to do so, because typedef library::type<blah>::whatever Bar; requires the full definition of class library::type, it's not the forward-declare that can solve.

于 2013-08-18T13:07:48.300 に答える