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

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

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

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

Q&A

解決済

2回答

2531閲覧

コードにある"::"の意味が分からないです。

hasu_non_sucre

総合スコア9

C++

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

0グッド

1クリップ

投稿2020/04/24 04:29

編集2020/04/24 05:00

前提・実現したいこと

以下のコードのtoupperの前にある::がなぜ付き、なぜつかなければエラーになるのか教えてください。

該当のソースコード

C++

1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 string a; 6 cin >> a; 7 8 transform(a.begin(), a.begin() + 1, a.begin(), ::toupper); 9 10 cout << a << endl; 11}

補足

::を消すと、
no matching function for call to 'transform(std::__cxx11::basic_string<char>::iterator, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >, std::__cxx11::basic_string<char>::iterator, <unresolved overloaded function type>)'
というエラーが出ます。

また、::を消してtoupper()という形にした場合、
no matching function for call to 'toupper()'
というエラーになりました。

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

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

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

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

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

maisumakun

2020/04/24 04:45

::なしでは、どのようなエラーが出ましたか?
hasu_non_sucre

2020/04/24 04:58

単に::を消すと、 no matching function for call to 'transform(std::__cxx11::basic_string<char>::iterator, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >, std::__cxx11::basic_string<char>::iterator, <unresolved overloaded function type>)' というエラーが出ました。 また、::を消してtoupper()という形にした場合、 no matching function for call to 'toupper()' というエラーになりました。
guest

回答2

0

ベストアンサー

グローバルな名前空間と,std名前空間の両方に toupper という関数が存在していて,
using namespace std;があるので,単にtouuperとだけ書かれると
どっちを使うのか判断できない ということではないでしょうか.

::toupper とすることで,グローバルな名前空間側を使うことを明記したのでエラーが無くなる.

投稿2020/04/24 05:28

編集2020/04/24 05:32
fana

総合スコア11654

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

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

hasu_non_sucre

2020/04/24 06:00

回答ありがとうございます!助かりました!
fana

2020/04/24 06:17

できれば低評価の理由をご教示願いたく.間違い等あれば知りたいので.
hasu_non_sucre

2020/04/24 07:02

私は高評価のほうに押してありますのでわかりかねます。(コメントにスクショ等貼れましたっけ...?)
fana

2020/04/24 07:24 編集

誰が自身の回答に高評価を出しているのかはわかる(低評価側はわからない)ので,その点の誤解はしていません. 先のコメントは「低評価した誰か」に向けてのコメントです. 以前,雑談的な質問に書いたことがありますが,私が望むのは「真っ当な形での低評価」です.せっかくの低評価なのに,コメントとセットでもらえないなら意味が無い. https://teratail.com/questions/233600#reply-340928
hasu_non_sucre

2020/04/24 08:05

そういうことでしたか、ご返信ありがとうごいました。
guest

0

「::」は名前空間を指定するために使います。(例:std::cin)
グローバル名前空間を指定する場合は、「::」の前の名前空間を省略します。

名前空間を省略した場合は、デフォルトで「using namespace」で指定した名前空間が使われます。
提示していただいたコードでは、「using namespace std;」が記述されているので、「toupper」は「std::toupper」として扱われますが、「std::toupper」は定義されていないため、エラーとなります。

「toupper」という記述では、「std::toupper」と「::toupper」のどちらの名前空間なのか解決できないため、エラーとなります。

「using namespace std;」をコメントアウトすれば、デフォルトでグローバル名前空間が使われるようになるため、エラーは出なくなります。
この場合は、string や cin など std 名前空間で定義されているクラスや関数は、個別で名前空間を指定する必要があります。

C++

1#include <bits/stdc++.h> 2 3// デフォルト std 名前空間を使わない(グローバル名前空間を使う) 4//using namespace std; 5 6int main() { 7 std::string a; 8 std::cin >> a; 9 10 transform(a.begin(), a.begin() + 1, a.begin(), toupper); 11 12 std::cout << a << std::endl; 13}

投稿2020/04/24 05:03

編集2020/04/24 06:05
nskydiving

総合スコア6500

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

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

asm

2020/04/24 05:26

std::toupperはありますし、別にstd::toupperを使ってもいいんです。 int (*tu)(int) = std::toupper; transform(a.begin(), a.begin() + 1, a.begin(), tu);
hasu_non_sucre

2020/04/24 06:00

回答ありがとうございます!助かりました!
nskydiving

2020/04/24 06:06

asm さんご指摘ありがとうございます。 もう解決してしまっていますが、修正しておきました。
fana

2020/04/24 06:13

(エラー要因に関する記述が間違っていると考えて「低評価」を押す→その理由コメントを書く前に一旦リロードしたらジャストタイミングで該当部分が打消し線されて修正されていた→「低評価」を取り消す)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問