50

ヘッダファイルで標準コンテナを前方宣言することは可能ですか? たとえば、次のコードを見てください。

#include <vector>

class Foo
{
private:
    std::vector<int> container_;
    ...
};

私はこのようなことができるようにしたい:

namespace std
{
    template <typename T> class vector;
}

class Foo
{
private:
    std::vector<int> container_;
    ...
};

これはできますか?

4

3 に答える 3

36

名前空間vectorでの宣言は未定義の動作です。したがって、コードは機能する可能性がありますが、機能しない可能性もあります。コンパイラーは、試行が機能しない場合に通知する義務を負いません。これは賭けであり、標準のC++ヘッダーを含めないようにする価値があるかどうかはわかりません。std

次のcomp.std.c++。moderatedの説明を参照してください。

std::vectorを前方宣言します。動作しますが、それは合法で標準に準拠していますか?

于 2008-11-21T00:30:37.357 に答える
18

container_コンパイラはオブジェクトに割り当てるスペースを知る方法がないため、そうは思いません。せいぜいあなたができること:

std::vector<int> *container_;

コンパイラーはポインターのサイズを知っているため、コンストラクターでそれを new します。

于 2008-11-21T00:00:07.247 に答える
12

他の人が言ったこととは別に、iostream といくつかの関連するテンプレートを前方宣言する認可された方法があることを知っておくと役に立つかもしれません: header <iosfwd>. 標準にそのようなヘッダーがもっとあると便利です。

于 2010-10-13T10:16:21.067 に答える