2013-03-26 25 views
7

Tại sao in sau ra "A boolean!"? Tôi nhận ra có một số chuyển đổi kỳ lạ xảy ra, vì nếu tôi xây dựng một cách rõ ràng một std :: string tôi nhận được hành vi chính xác. Nhưng tại sao độ phân giải quá tải chọn visitor::operator()(bool) trong trường hợp sau?boost :: biến thể khách truy cập chọn quá tải sai

#include <boost/variant.hpp> 
#include <string> 

typedef boost::variant<bool, std::string> type; 

struct visitor : public boost::static_visitor<> { 
    void operator()(bool b) const { 
     std::cout << "A boolean!" << std::endl; 
    } 

    void operator()(const std::string& str) const { 
     std::cout << "A string!" << std::endl; 
    } 
}; 

int main(int argc, char* argv[]) { 
    type t = "I am a string"; 
    t.apply_visitor(visitor()); 

    return 0; 
} 

Tôi đang chạy Visual Studio 2012 (CTP hay không cho kết quả tương tự)

+0

FTR thành viên 'apply_visitor' không phải là một phần của giao diện công khai. Bạn phải sử dụng phiên bản tự do: 'apply_visitor (visitor(), t)'. –

+0

Cảm ơn @LucDanton. Bị bỏ lỡ khi tôi đọc tài liệu –

Trả lời

7

Bạn đang initialisng t với một (loại phân rã đến) const char*. Chuyển đổi con trỏ thành bool là chuyển đổi chuẩn, trong khi chuyển đổi const char* thành std::string là chuyển đổi do người dùng xác định. Việc chuyển đổi tiêu chuẩn được ưu tiên.

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