Mã này hoạt động:chức năng vs khai báo biến trong C++
std::ifstream f(mapFilename.c_str());
std::string s = std::string(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
ParseGameState(s);
Nhờ đó mà mapFilename
là một std::string
và void ParseGameState(const std::string&);
.
Và đây không:
std::ifstream f(mapFilename.c_str());
std::string s(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
ParseGameState(s);
Đây là lỗi:
game.cpp: In member function ‘int Game::LoadMapFromFile(const std::string&)’:
game.cpp:423: error: no matching function for call to ‘ParseGameState(std::string (&)(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> > (*)()))’
game.cpp:363: note: candidates are: ParseGameState(const std::string&)
Vì vậy, có vẻ như nó nhận ra s
như một tuyên bố chức năng và không phải là một khai báo biến trong trường hợp này.
Tại sao lại như vậy? Đây có phải là một lỗi trong GCC 4.2.1 (Apple xây dựng)? Hay GCC xử lý điều này một cách chính xác? Đây có phải là không xác định trong tiêu chuẩn C++?
Cảm ơn! [Ở đây trên WP] (http://en.wikipedia.org/wiki/Most_vexing_parse) cũng là một lời giải thích tốt về phân tích cú pháp khó chịu nhất. – Albert
Dường như việc khai báo biến 'std :: string' ở trên sẽ không hoạt động trong C++ 0x: Bởi vì' std :: string' có một hàm tạo danh sách khởi tạo, toàn bộ '{...} 'sẽ được coi như một đối số, và sẽ cố gắng khởi tạo tham số' initializer_list 'và không biên dịch: ( –
@Johannes: Yup, tôi nghĩ bạn nói đúng. Tôi gần như tự hỏi liệu nó có tốt hơn không nếu điều này được viết lại thay vì xem xét danh sách khởi tạo và sau đó (chỉ khi không có), hãy xem xét các ctors khác, nếu thay vào đó nó chỉ xây dựng một tập quá tải và chọn một kết hợp tốt nhất - có thể với điều chỉnh nhỏ mà tạo ra initializer_list sẽ tương đương với không có chuyển đổi liên quan đến tính tốt đẹp của trận đấu (với điều kiện mà tôi đã chỉ nghĩ về nó một vài phút, do đó có thể gây ra một vấn đề tinh tế (hoặc thậm chí là lóa) mà tôi đang thiếu) –