メインプログラムに#include <algorithm>を書いて、
そのメインプログラムが
// キャラクターリストをy座標に基づいてソート
std::sort(characters.begin(), characters.end(), compareCharacters);
を含む関数を扱うのですが、
この関数の書いてあるヘッダファイルには#include <algorithm>は書いていません。
するとstd::sort(characters.begin(), characters.end(), compareCharacters);を含む関数が書かれたメインプログラムに#include <algorithm>が書いてあるのに
std::sort(characters.begin(), characters.end(), compareCharacters);は宣言されていないとエラーが出ます。
なぜでしょうか?
また、メインプログラムだけに#include <algorithm>が書いて、
ヘッダファイルに書かれたstd::sort(characters.begin(), characters.end(), compareCharacters);をエラーを起こさずコンパイルする方法はありますでしょうか?
どうか分かりやすく教えて下さい。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
なお
どうしてもヘッダで std::sort を使いたい
というのであれば, ふつうの人は当該ヘッダで <algorithm> を #include する. 書かない理由ってどこにもないよねぇ.
No.2
- 回答日時:
C でも C++ でも原則として
名前は使う前に宣言しなければならない
のだ (goto のラベルは例外). だから, その std::sort(なんとか) よりも前に std::sort の宣言 (実質的には #include <algorithm>) が出てくるように書いてあればいい.
んだけど, なんで「ヘッダファイル」に
std::sort(characters.begin(), characters.end(), compareCharacters);
が出てくるんだろうか. そこが既に (考え方として) 間違っているような気がするぞ.
No.1
- 回答日時:
エラーが出る原因は、C++のコンパイラは前方宣言が必要だからです
つまり、std::sortを使う前に、std::sortが宣言されている必要があるにも関わらず、宣言をせずに、std::sortを使用しているからです
例として、
main.cpp // #include <algorithm>が書いてある
main.h // std::sortを使ってるプログラムがある
main.cppの中身が
#include "main.h"
#include <algorithm>
の順であれば、std::sortが前方宣言されてないためエラーになります
#include <algorithm>
#include "main.h"
であれば、std::sort宣言が含まれているヘッダーが含まれおり、前方宣言されているので、エラーにはなりません
通常、ヘッダーファイル内で標準ライブラリを使用する場合には、ソースの移植性を損なわないように、前方宣言をヘッダーファイル内で解決できるように、標準ライブラリのヘッダーファイルをインクルードします
つまり、#include <algorithm>を、std::sortを使っているヘッダーファイルにも入れるのが解決方法として、的してると思います
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# このプログラミング誰か教えてください 9 2022/04/22 18:50
- C言語・C++・C# このプログラミング誰か教えてください。 2 2022/04/22 18:48
- その他(プログラミング・Web制作) .htaccessファイルの修正がこれで問題ないかどうか 1 2022/04/21 08:42
- C言語・C++・C# このプログラミング誰か教えてくれませんか 2 2022/05/14 09:45
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
enumの値から定義名を文字列化...
-
なぜ、C++の標準ヘッダをインク...
-
空ENTERの判別
-
指定した文字を削除したい
-
#defineの使い方について
-
snprintfが使用できない。
-
wstringの主力
-
std::map の const 修飾について
-
#define中の#のエスケープ
-
c++のvirtual関数および継承に...
-
C++ 数値データファイルから2次...
-
C++で、環境変数の読み込み方を...
-
構文エラーが出ているのですが...
-
c++ ファイルからの複素数の読...
-
string型のフォーマット書式指...
-
gccでコンパイル時のエラー
-
C++文字配列ソート関数を教えて...
-
C言語のエラーを修正したい
-
iostream インクルード時に発生...
-
_tcscat がうまくいきません(V...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
switch文のエラーについて
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
enumの値から定義名を文字列化...
-
空ENTERの判別
-
C++でShowCursorを使いたい。
-
なぜ、C++の標準ヘッダをインク...
-
#define中の#のエスケープ
-
C++で、テキストファイルを一行...
-
gccでコンパイル時のエラー
-
C言語のエラーを修正したい
-
#include "fstream.h"
-
C言語のポインターで詰まっている
-
リモートデスクトップの接続元I...
-
構造体配列のvectorへの変換と...
-
JPEGやPNGが読めるLoadImage関数
-
VS2019でofstreamが未定義になる
-
構造体に決められた文字列を入...
-
VHDLのsignedとunsignedの違いは?
-
std::wstringのメモリリークに...
おすすめ情報