質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Namespace

各要素の名前の重複による衝突が起こらないよう、一意の名前をつけなければならない範囲のことであり、また、プログラミングにおける識別名を付加する機能のをNamespace(名前空間)と呼ぶ。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

1回答

7859閲覧

C++における名前空間

Riliumph

総合スコア13

Namespace

各要素の名前の重複による衝突が起こらないよう、一意の名前をつけなければならない範囲のことであり、また、プログラミングにおける識別名を付加する機能のをNamespace(名前空間)と呼ぶ。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2015/08/02 14:06

C++でサンプルを動かしていて、少し躓いたというか疑問が浮かんだので質問させていただきます。
以下のコードを動かしていました。

lang

1#include <iostream> 2template < typename Func > 3void f( Func func ) 4{ 5 func( "fuga" ); 6} 7 8int main( void ) 9{ 10 std::string x = "hoge"; 11 f( [&]( std::string const & str ) { x += str; } ); 12 std::cout << x << std::endl; 13 return 0; 14}

上記のコードは、coutの<<演算子でstringクラス用の<<演算子は無いとエラーになります。

lang

1#include <string>

を忘れているのが原因です。

char型用<<演算子を使ってx.c_str()にすれば動きますが、疑問はそこではなく、
**「#include <string>忘れていたのに、なんでstringクラスのインスタンス(?)が作れているのか」**が疑問なのです。

lang

1std::string x = "hoge";

上記の箇所でエラーにならなかったのが、少し腑に落ちないというか……

そこで
1.#include<string>忘れたのにstringクラスを生成できているのは何故?
2.std::つければどの程度の操作が出来るの?
というのを教えていただければと思います。

いや、定義ファイル読めやって話なんですども。
Visual Studio 2013でstd空間覗くとstringファイルを見てるのは分かりましたが、
stringクラスはxstringファイルを見てるみたいですし、
だんだん何処に何が管理されているのか分からなくなってしまったのです。

他にも「こういうの知っとけば理解進むかもね」というのがあればうれしいです。
どうか、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

1.#include<string>忘れたのにstringクラスを生成できているのは何故?

#include <iostream>std::stringのクラス定義が含まれているからです。

C++の標準ヘッダは一つの大きなヘッダではなく、
それぞれの機能に分けられた数多くの小さなヘッダをincludeしている形で作られています。
その小さなヘッダの中にはstd::stringを定義しているだけのヘッダもあります。
<iostream>にはstd::stringを引数や戻り値にする関数が含まれているため、
std::stringを定義しているだけのヘッダもincludeしています。
そのため、#inculde <iostream>するだけでstd::stringが使用できます。

では、<string>は何かというと、std::stringを定義しているだけのヘッダを
includeすることはもちろんですが、std::string自体の定義だけではなく、
std::stringを使用するstd::stringメンバーではない関数 も追加で定義します。
stringを使う<<はまさしくその一つで、#include <string>をしないと使えません。

2.std::つければどの程度の操作が出来るの?

std::はただの名前空間の接頭子ですので、
それぞれのライブラリヘッダをincludeしなければ何も使えません。
逆に、多くの標準ライブラリはstdの名前空間にあるため、std::をつけないと使えません。
(例外として、C由来の関数はstdの名前空間にはありません)
std::をつけると使える、
のではなく、
各関数やクラスがstdという名前空間に定義されている、
となっています。

投稿2015/08/02 20:19

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問