2011-07-22 16 views
4

実装でtypedefによって設定される不完全な型へのポインタを宣言する方法はありますか?ここで不完全な型のtypedefへのポインタ

は、私が何をしたいのですexemple:

#ifndef TEST_H 
#define TEST_H 

namespace std { 
    class string; // THIS WON'T WORK! 
} 

struct Test { 
    std::string *value; 
}; 

#endif 

文字列がのbasic_stringへのtypedefであるので、exempleのコードは動作しません。不完全な型のstd :: basic_stringを宣言できますが、回避策のように見えます。

私は、コンパイラがtypedefのシンボルを生成しないことを知っています。異なるファイルの異なる型のtypedefで同じ名前を使うことができます。しかしポインタは(少なくともコンパイラにとって)ポインタなので、そのようなことをすることは可能です。

EDIT:これはちょっとした作業例です。私の本当の問題では、ファサードだけが知っている必要があるライブラリのクラスを使用するFacadeがあります(いいえ、std :: stringではなく、ライブラリはstlではありません)。私は実際には循環的なインクルージョンが心配ではありませんが、プロジェクトの多くのファイルにこのファサードが(直接的または間接的に)含まれているため、コンパイル時に心配していますので、ライブラリファイルをFacadeの実装ファイルにのみ入れたい。

+1

多くのコンパイラは、「」を提供しています。 –

答えて

5

いいえ、そうではありません。

実際、この時点では、ちょうど#include <string>にする必要があります。 stringと循環する依存関係を持つことができないため、有害ではありません。標準ヘッダーではヘッダーが存在することさえわかりません。

std::string*は、とにかく間違っています。

フォワード
+2

'std :: string *は普通は間違っていますが、とにかくです。':そうです... +1 – paercebal

+0

std :: string *は通常間違っていると私は同意しますが、 – fbafelipe

+1

愚かなミニマルな作業例。 –

3

std::stringは、次のようなものに見えるかもしれません宣言:私は、それらを一度だけ宣言することができるので(これがbasic_stringは、デフォルトのテンプレート引数を持っていることを宣言転送しようとしません

namespace std 
{ 
    template <class T, class Traits, class Allocator> 
    class basic_string; 

    template <class T> 
    class char_traits; 

    template <class T> 
    class allocator; 

    typedef basic_string<char, char_traits<char>, allocator<char> > string; 
} 

Example.

を。容疑者だけライブラリ作者はそれをやってのけるのに十分なコントロールを持っているかもしれません。)


std::string*の使用方法について質問すると、誰もそれらを動的に割り当てることはないと思います。しかし、他の文字列を別の場所(またはNULL)で参照したいことは有効ではありませんか?

1

namespace stdでの宣言は(ほとんど)未定義です。標準ライブラリオブジェクト、関数、またはタイプを参照する唯一の正当な方法は、関連するヘッダを組み込んだ後です。 17.4.3.1はこう述べている。

関連する問題