とあるクラスのメソッドの引数がstd::string型のとき、
ヘッダファイルでのクラス宣言(先行宣言)の書き方がよくわからんす。
--------------
//Hoge.h
//class std::string; //ダメ
//class string; //ダメ。Hogeの定義の方がおこられる
//#include <string> //OKだけどstringの定義はいらないはず。
class Hoge{
public:
void Method( const std::string& str );
};
--------------
std::を付けるのは無駄なんでしょうか?
>ヘッダファイルでのクラス宣言(先行宣言)の書き方がよくわからんす
このような表現(ヘッダファイルでのクラス宣言(先行宣言))は始めて目にするのでどういう
ことを指しているのか判りません。判りやすく説明してくださいませんか
>//#include <string> //OKだけどstringの定義はいらないはず。
何故、そう(要らないはずだと)判断するのですか、わけを教えて下さい
コンパイラーが文句言わないのなら、コンパイラーにとって必要なのではないでしょうか?
>std::を付けるのは無駄なんでしょうか?
どこでの std:: のことを言っているのか判りませんのでなんともお返事しかねます
ありゃりゃ。
ねんのため環境:winXP VC++6
>始めて目にするのでどういうことを指しているのか判りません。
>判りやすく説明してくださいませんか
俺が?
C++のランゲージスペックを作った人に聞いてくださいな。
forward (class) declarationとかいうものかな?
>何故、そう(要らないはずだと)判断するのですか、わけを教えて下さい
コンパイル依存性を避けるため。
コンパイルに必要の無いものは、他のヘッダファイルをインクルードするな。
という神のお告げを信じてるから。
そのため、forward (class) declarationとしてヘッダファイルに書きました。
>コンパイラーが文句言わないのなら、コンパイラーにとって必要なのではないでしょう
か?
さあ?
>どこでの std:: のことを言っているのか判りませんのでなんともお返事しかねます
public:
void Method( const std::string& str );
↑ここ
クラス定義のなかのメソッドの引数仕様に、ネームスペースまで書くのは無駄なのか
無駄じゃないのか?っていう質問でした。はい。
ふつーのクラスだったら
namespace std {
class string;
}
ってやればよさげなんだけど、
std::stringはtypedefだからなぁ...
namespace std {
class string;
}
これは気づかなかった。どうもです!
なんかtypedefのものだとうまくいかないですね・・・。
やっぱincludeしないといけないかなぁ・・・。
かなり微妙・・・
モヤモヤ解決っと。
namespace std
{
template <class E> struct char_traits;
template <class T> class allocator;
template <class E, class T=char_traits<E>,
class A=allocator<E> > class basic_string;
typedef basic_string<char> string;
};
class Hoge
{
public:
void method( const std::string& str );
};
こんなんで、できました。(VC++ 6.0)
ちなみに Effective C++ の第34項や第49項で、まさにこの問題が
扱われています。
http://www.ascii.co.jp/books/detail/4-7561/4-7561-1808-9.html
第49項には、dairygoods さんが示されたのと同質の先行宣言の記述が
あるのと同時に、
「#include <string> してもコンパイル時のオーバーヘッドは比較的
少ないから、思い切って include するのも手」
という内容も書いてありますね。
dairygoods殿、Thanxです。
Effective本、読み直してみました。
ポイントをさしていただき助かりました、FREDY殿
これですっきり解決。
島さん返事かいてくれたんだから、アドバイスしないで良いのですか?