アプリ版:「スタンプのみでお礼する」機能のリリースについて

メインプログラムに#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件)

なお


どうしてもヘッダで std::sort を使いたい
というのであれば, ふつうの人は当該ヘッダで <algorithm> を #include する. 書かない理由ってどこにもないよねぇ.
    • good
    • 2

C でも C++ でも原則として


名前は使う前に宣言しなければならない
のだ (goto のラベルは例外). だから, その std::sort(なんとか) よりも前に std::sort の宣言 (実質的には #include <algorithm>) が出てくるように書いてあればいい.

んだけど, なんで「ヘッダファイル」に
std::sort(characters.begin(), characters.end(), compareCharacters);
が出てくるんだろうか. そこが既に (考え方として) 間違っているような気がするぞ.
    • good
    • 2

エラーが出る原因は、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を使っているヘッダーファイルにも入れるのが解決方法として、的してると思います
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!