
テキストファイルの内容を表示するプログラムを以下のようにしたところコンパイルエラーとなりました。
std::string ReadFile(const char *aFileName) {
std::ifstream ifs(aFileName);
std::string abc(std::istreambuf_iterator<char>(ifs),
std::istreambuf_iterator<char>());
return abc;
}
int main() {
std::cout << ReadFile("sample.txt") << std::endl;
}
そこで、
std::string abc(std::istreambuf_iterator<char>(ifs),
std::istreambuf_iterator<char>());
の部分を
std::string abc((std::istreambuf_iterator<char>(ifs)),
std::istreambuf_iterator<char>());
のように括弧でくくると、正常に動作します。
一見するとこの括弧には意味がないように思えるのですが、
なぜ、括弧でくくる必要があるのか
教えていただけないでしょうか
No.2
- 回答日時:
あぁ, うん, 想定通りのメッセージだ.
まず, エラーの原因は
std::string abc(std::istreambuf_iterator<char>(ifs),
std::istreambuf_iterator<char>());
という文が「変数 abc の定義」と「関数 abc の宣言」の両方で解釈できるため, 規定により後者とみなされていることによります. 実際, abc が関数だと思えば妥当なエラーメッセージですよね.
で, 例えばかっこをつけて
std::string abc((std::istreambuf_iterator<char>(ifs)),
std::istreambuf_iterator<char>());
とすると, 今度は「関数の宣言」とは考えられなくなるため期待通り「変数 abc の定義」と解釈されるわけです.
今だと
std::string abc{std::istreambuf_iterator<char>(ifs),
std::istreambuf_iterator<char>()};
のように {} を使うほうが安全かもしれませんが, これはこれでちょっと怪しかったりします.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
enumの値から定義名を文字列化...
-
snprintfが使用できない。
-
openCVで動画が読み込めないエ...
-
#defineの使い方について
-
VC++で文字列から任意の文字を...
-
RS232cと通信が可能な、Cまたは...
-
switch文のエラーについて
-
includeファイルが開けない
-
UNICODE環境でCStringをstd::st...
-
【C++】ヘッダ内でstringを格納...
-
CStdioFile での数値データの読...
-
#define中の#のエスケープ
-
C++のifstreamの使い方
-
構造体配列のvectorへの変換と...
-
c++で、cvMatからvectorへの変...
-
C言語からgnuplot呼び出し
-
STLのstringのサイズが0なのに...
-
構文エラーが出ているのですが...
-
mainの外に変数 vs ポインタ渡し
-
空ENTERの判別
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++で文字列から任意の文字を...
-
switch文のエラーについて
-
【C++】ヘッダ内でstringを格納...
-
enumの値から定義名を文字列化...
-
なぜ、C++の標準ヘッダをインク...
-
gccでコンパイル時のエラー
-
C++でShowCursorを使いたい。
-
#defineの使い方について
-
VxWorks 6.4ソケット接続につい...
-
空ENTERの判別
-
OpenCVでRAW画像(カラー)を開...
-
CStringとString
-
途中からMFCを使用したい
-
snprintfが使用できない。
-
C++での <iostream.h>と<iostre...
-
_tcscat がうまくいきません(V...
-
リモートデスクトップの接続元I...
-
#define中の#のエスケープ
-
C++ 数値データファイルから2次...
-
コーディング
おすすめ情報
エラーとなるのは
return abc;
の行で、その内容は、
C2440
'std::string (__cdecl *)(std::istreambuf_iterator<char,std::char_traits<char>>,std::istreambuf_iterator<char,std::char_traits<char>> (__cdecl *)(void))' から 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' に変換できません。
です。