2012-01-25 30 views
9

Tôi đang cố đọc một ký tự đơn lẻ từ một luồng. Với đoạn mã sau, tôi nhận được lỗi trình biên dịch "quá tải không rõ ràng" (GCC 4.3.2, and 4.3.4). Tôi đang làm gì sai?Lỗi trình biên dịch GCC khi trích xuất một char từ một dòng tạm thời

#include <iostream> 
#include <sstream> 

int main() 
{ 
    char c; 
    std::istringstream("a") >> c; 
    return 0; 
} 

Ghi chú:

  • Visual Studio 2008 biên dịch mà không có lỗi
  • loại khác (int, double) đang làm việc
  • Nếu đầu tiên tôi tạo ra một biến std::istringstream iss("a"); iss >> c, trình biên dịch cung cấp cho không có lỗi
+0

Thực ra, trong điểm bullet thứ ba của bạn, đó là nơi cuối cùng bạn cũng không tạo ra một biến tạm thời. –

+0

@LightnessRacesinOrbit: Cảm ơn, tôi đã sửa điểm cuối cùng. –

Trả lời

9

Hoạt động khai thác hoặc >> cho nhân vật là một hàm không thành viên mẫu:

template<class charT, class traits> 
    basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&); 

Từ này có số đầu tiên của mình bằng cách không const tham khảo, bạn không thể sử dụng tạm thời rvalue đó. Vì vậy, mã của bạn không thể chọn quá tải này, chỉ có quá tải hàm thành viên khác nhau, không có phần nào trong số đó khớp với cách sử dụng này.

Mã của bạn hợp lệ trong C++ 11, bởi vì cũng có một toán tử trích xuất tham chiếu rvalue làm đối số đầu tiên.

Visual Studio 2008 biên dịch mà không có lỗi

Một trong những phần mở rộng phi tiêu chuẩn của trình biên dịch đó là cho phép tạm thời rvalues ​​ bị ràng buộc để không tham khảo const.

loại khác (int, double) đang làm việc

Hầu hết các nhà khai thác khai thác với nhiều loại cơ bản là hàm thành viên, trong đó thể được kêu gọi tạm thời rvalue.

Nếu đầu tiên tôi tạo ra một biến std::istringstream iss("a"); iss >> c, trình biên dịch cung cấp cho không có lỗi

iss là một tổ chức phi tạm vế trái, vì vậy nó có thể được liên kết với một tài liệu tham khảo const phi.

+0

Tôi nhớ rằng studio trực quan có phần mở rộng có thể ràng buộc rvalue để không const lvalue ref, nhưng phần mở rộng đó cho cảnh báo trong VS được bỏ qua bởi người hỏi tôi đoán. Anyways +1 cho một câu trả lời tốt đẹp :) –

+0

@ Mr.Anubis: Tôi không nhận được cảnh báo cho chương trình này. Tôi không nhận được một cảnh báo cho 'std :: istringstream & ss = std :: istringstream (" a "); hoặc –

+0

@ Mr.Anubis: Sau khi bình luận của bạn tôi biên dịch lại một lần nữa mà không có cảnh báo! Nhưng sau khi thay đổi mức cảnh báo từ '/ W3' (có vẻ như mặc định) thành'/W4' thì tôi nhận được một cảnh báo như vậy. –

4

Chữ ký cho operator>> đọc một char

template<class charT, class traits> 
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>& in,charT& c); 

Theo các quy tắc ngôn ngữ, tạm thời không thể liên kết với các tham số đầu tiên là tạm thời không thể liên kết với một tham chiếu không const.

Visual Studio 2008 cho phép điều này dưới dạng tiện ích mở rộng MS. Các phiên bản sau sẽ cảnh báo bạn rằng nó không được phép.

Các vấn đề liên quan