先行宣言したいけど名前空間が。 – プログラミング – Home

先行宣言したいけど名前空間が。
 
通知
すべてクリア

[解決済] 先行宣言したいけど名前空間が。


kyu
 kyu
(@kyu)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

とあるクラスのメソッドの引数がstd::string型のとき、
ヘッダファイルでのクラス宣言(先行宣言)の書き方がよくわからんす。
--------------
//Hoge.h

//class std::string; //ダメ
//class string; //ダメ。Hogeの定義の方がおこられる
//#include <string> //OKだけどstringの定義はいらないはず。

class Hoge{
public:
void Method( const std::string& str );
};
--------------

std::を付けるのは無駄なんでしょうか?


引用未解決
トピックタグ
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

>ヘッダファイルでのクラス宣言(先行宣言)の書き方がよくわからんす
このような表現(ヘッダファイルでのクラス宣言(先行宣言))は始めて目にするのでどういう
ことを指しているのか判りません。判りやすく説明してくださいませんか

>//#include <string> //OKだけどstringの定義はいらないはず。
何故、そう(要らないはずだと)判断するのですか、わけを教えて下さい
コンパイラーが文句言わないのなら、コンパイラーにとって必要なのではないでしょうか?

>std::を付けるのは無駄なんでしょうか?
どこでの std:: のことを言っているのか判りませんのでなんともお返事しかねます


返信引用
kyu
 kyu
(@kyu)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

ありゃりゃ。
ねんのため環境:winXP VC++6

>始めて目にするのでどういうことを指しているのか判りません。
>判りやすく説明してくださいませんか

俺が?
C++のランゲージスペックを作った人に聞いてくださいな。
forward (class) declarationとかいうものかな?

>何故、そう(要らないはずだと)判断するのですか、わけを教えて下さい

コンパイル依存性を避けるため。
コンパイルに必要の無いものは、他のヘッダファイルをインクルードするな。
という神のお告げを信じてるから。
そのため、forward (class) declarationとしてヘッダファイルに書きました。

>コンパイラーが文句言わないのなら、コンパイラーにとって必要なのではないでしょう
か?

さあ?

>どこでの std:: のことを言っているのか判りませんのでなんともお返事しかねます

public:
void Method( const std::string& str );
↑ここ

クラス定義のなかのメソッドの引数仕様に、ネームスペースまで書くのは無駄なのか
無駄じゃないのか?っていう質問でした。はい。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

ふつーのクラスだったら

namespace std {
class string;
}

ってやればよさげなんだけど、
std::stringはtypedefだからなぁ...


返信引用
kyu
 kyu
(@kyu)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

namespace std {
class string;
}

これは気づかなかった。どうもです!

なんかtypedefのものだとうまくいかないですね・・・。
やっぱincludeしないといけないかなぁ・・・。
かなり微妙・・・
モヤモヤ解決っと。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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)


返信引用
FREDY
 FREDY
(@FREDY)
ゲスト
結合: 22年前
投稿: 2
 

ちなみに Effective C++ の第34項や第49項で、まさにこの問題が
扱われています。
http://www.ascii.co.jp/books/detail/4-7561/4-7561-1808-9.html

第49項には、dairygoods さんが示されたのと同質の先行宣言の記述が
あるのと同時に、
 「#include <string> してもコンパイル時のオーバーヘッドは比較的
  少ないから、思い切って include するのも手」
という内容も書いてありますね。


返信引用
kyu
 kyu
(@kyu)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

dairygoods殿、Thanxです。

Effective本、読み直してみました。
ポイントをさしていただき助かりました、FREDY殿

これですっきり解決。


返信引用
///////////
 ///////////
(@///////////)
ゲスト
結合: 22年前
投稿: 1
 

島さん返事かいてくれたんだから、アドバイスしないで良いのですか?


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました