2010-06-10 102 views
2

visual studio告訴我「錯誤C2664:'boost :: asio :: mutable_buffer :: mutable_buffer(const boost :: asio :: mutable_buffer &)':不可能將參數1從'char'轉換爲'const boost :: asio :: mutable_buffer &'位於consume_buffers.hpp的第163行「boost :: asio buffer無法將參數從char轉換爲const mutable_buffer&

我不確定爲什麼發生這種情況,也不知道如何解決它(否則我不會問這^^'),但我認爲它可能與這些功能有關..甚至強硬我試過他們在另一個項目,一切工作正常...但我幾乎找不到有什麼不同

so ... here comes代碼th在可能是相關的,如果有什麼有用的東西似乎失蹤,我會很樂意發送它。

數據包是這個類的所有實例。

class CPacketBase 
{ 
protected: 
const unsigned short _packet_type; 
const size_t _size; 
char* _data; 

public: 
CPacketBase(unsigned short packet_type, size_t size); 
~CPacketBase(); 

size_t get_size(); 
const unsigned short& get_type(); 
virtual char* get(); 
virtual void set(char*); 
}; 

這發出了一個給定的包

template <typename Handler> 
void async_write(CPacketBase* packet, Handler handler) 
{ 
    std::string outbuf; 
    outbuf.resize(packet->get_size()); 
    outbuf = packet->get(); 
    boost::asio::async_write(_socket 
    , boost::asio::buffer(outbuf, packet->get_size()) 
    , handler); 
} 

這使閱讀包,並調用該數據包的報頭(無符號短)解碼功能,調整緩衝區將它發送到另一個函數讀取真實從分組

template <typename Handler> 
void async_read(CPacketBase* packet, Handler handler) 
{ 
    void (CTCPConnection::*f)(const boost::system::error_code& 
     , CPacketBase*, boost::tuple<Handler>) 
     = &CTCPConnection::handle_read_header<Handler>; 
    boost::asio::async_read(_socket, _buffer_data 
    , boost::bind(f 
    , this 
    , boost::asio::placeholders::error 
    , packet 
    , boost::make_tuple(handler))); 
} 

數據,這是由async_read一旦接收到分組稱爲

template <typename Handler> 
void handle_read_header(const boost::system::error_code& error, CPacketBase* packet, boost::tuple<Handler> handler) 
{ 
    if (error) 
    { 
    boost::get<0>(handler)(error); 
    } 
    else 
    { 
    // Figures packet type 
    unsigned short packet_type = *((unsigned short*) _buffer_data.c_str()); 

    // create new packet according to type 
    delete packet; 
    ... 

    // read packet's data 
    _buffer_data.resize(packet->get_size()-2); // minus header size 

    void (CTCPConnection::*f)(const boost::system::error_code& 
    , CPacketBase*, boost::tuple<Handler>) 
     = &CTCPConnection::handle_read_data<Handler>; 
    boost::asio::async_read(_socket, _buffer_data 
    , boost::bind(f 
    , this 
    , boost::asio::placeholders::error 
    , packet 
    , handler)); 
    } 
} 
+0

評論boost :: asio :: async_read調用使我能夠構建項目一次,然後即使我取消註釋它我仍然可以構建解決方案,但重建給了我不同的錯誤: 「'const iterator':不是'boost :: asio :: mutable_buffer'的成員'' ''語法錯誤:在'const_iterator'之前缺少',' – 2010-06-10 08:22:07

+0

您調用中的_buffer_data類型是什麼'提高:: ASIO :: async_read'? – bjlaub 2010-06-10 11:53:44

+0

我試過std :: string,std :: vector 和boost :: array ,但是它們並不一定把它們的所有數據放在同一個內存區域,這就是問題的根源,顯然 – 2010-06-11 03:34:08

回答

3

基於這一行代碼...

unsigned short packet_type = *((unsigned short*) _buffer_data.c_str()); 

...我猜你使用的是std::string作爲類型_buffer_data並試圖將數據讀入其使用boost::asio::async_read。你不能這樣做(請參閱我的答案在這裏作出解釋:How to asynchronously read to std::string using Boost::asio?

您可以嘗試使用boost::asio::buffer的工廠過載之一併使用POD類型,如char *。例如:

char * _buffer_data = new char[packet->get_size()-2]; 
boost::asio::async_read(
    _socket, 
    boost::asio::buffer(_buffer_data, packet->get_size()-2), 
    //.... 

(我沒有測試這一點,但在理論上它應該創建一個可變的緩衝包裝有最多packet->get_size()-2字節的原始字符數組有道理...)

你也可以嘗試使用boost::shared_array<char>代替,但我不確定是否可以隱式轉換爲可變緩衝區,因此您必須滾動您自己的「可變緩衝區」。請注意,因爲boost::asio::async_read是一個模板函數,所以第二個參數的類型沒有嚴格定義,實際上可以是任何遵守可變緩衝區的概念概念。看到這個頁面的更多信息:http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/reference/MutableBufferSequence.html

+0

完全可以工作,謝謝;) 也解釋了爲什麼std :: vector 數組沒有工作... ,我認爲它在我的其他項目工作,因爲我從來沒有調整我的陣列... 嗯,謝謝^ _ ^ – 2010-06-11 03:30:39

相關問題