web-dev-qa-db-ja.com

フォワードSTLコンテナーを宣言しますか?

ヘッダーファイルでSTLコンテナーを転送宣言することはできますか?たとえば、次のコードを見てください。

#include <vector>

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

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

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

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

これはできますか?

47
Rob

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

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

std :: vectorを宣言して転送します。動作しますが、合法で標準に準拠していますか?

33
Rob Kennedy

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

std::vector<int> *container_;

コンパイラーはポインターのサイズを認識しているため、コンストラクターに新しく追加します。

17
Evan Teran

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

10
Sebastian Mach