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

テキストファイルの内容を表示するプログラムを以下のようにしたところコンパイルエラーとなりました。
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>());
のように括弧でくくると、正常に動作します。
一見するとこの括弧には意味がないように思えるのですが、
なぜ、括弧でくくる必要があるのか
教えていただけないでしょうか

質問者からの補足コメント

  • エラーとなるのは
    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>>' に変換できません。

    です。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/03/19 18:08

A 回答 (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>()};
のように {} を使うほうが安全かもしれませんが, これはこれでちょっと怪しかったりします.
    • good
    • 0
この回答へのお礼

納得しました。ありがとうございました。

お礼日時:2018/03/20 07:58

ちなみにですが, どのようなエラーメッセージが出ているのでしょうか?

この回答への補足あり
    • good
    • 0

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