引用: Effective C++ 第3版
stringはクラスではなく、basic_stringをtypedefしたものです。そのため、stringの前方宣言は誤りということになります。正しい前方宣言は、他のテンプレートも含めなくてはならないので、もっとずっと複雑になります。しかし、それは大きな問題ではありません。そもそも標準ライブラリの一部を取り出して前方宣言するべきではないのです。標準ライブラリについては、単純に#includeを使えばよいのです。
- std::wstring
- std::u16string
- std::u32string
See §21.4 Class template basic_string [basic.string] of the C++11 specification.