テキストファイルの内容を表示するプログラムを以下のようにしたところコンパイルエラーとなりました。
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- 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/05/14 09:45
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- C言語・C++・C# このプログラミング誰か教えてください。 2 2022/04/22 18:48
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# メインプログラムに#include <algorithm>を書いて、 そのメインプログラムが // 3 2023/05/02 11:24
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# char string[100]; int c, i=0; while( (c=getchar()) 2 2022/05/30 21:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#defineの使い方について
-
リモートデスクトップの接続元I...
-
openCVで動画が読み込めないエ...
-
iostream インクルード時に発生...
-
C++で縦の棒グラフ
-
std::map の const 修飾について
-
atlbase.h と afxwin.hの同時定義
-
wstringの内容を表示させたい
-
ヘッダーファイルがインクルー...
-
ファイル読み込みとmap処理
-
前回のクライアント側のプログ...
-
構文エラーが出ているのですが...
-
セグメンテーションフォルトが...
-
VC++ iostreamの不具合(?)
-
string型のフォーマット書式指...
-
テイラー展開とその精度について
-
コンパイルできません
-
C++ basic_ostreamの拡張
-
Cでのパケットキャプチャについて
-
mapの初期化
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
enumの値から定義名を文字列化...
-
switch文のエラーについて
-
空ENTERの判別
-
なぜ、C++の標準ヘッダをインク...
-
【C++】ヘッダ内でstringを格納...
-
C++での <iostream.h>と<iostre...
-
#include "fstream.h"
-
#define中の#のエスケープ
-
JPEGやPNGが読めるLoadImage関数
-
リモートデスクトップの接続元I...
-
CStringとString
-
string型のフォーマット書式指...
-
std::map の const 修飾について
-
VHDLのsignedとunsignedの違いは?
-
このプログラミング誰か教えて...
-
構造体配列のvectorへの変換と...
-
指定した文字を削除したい
-
構造体に決められた文字列を入...
おすすめ情報
エラーとなるのは
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>>' に変換できません。
です。