2013-02-23 37 views
0

我試圖編譯這段代碼boost-asio編譯失敗(C++類中的初始化列表)?

#ifndef TCPIP_H 
#define TCPIP_H 

#include <cstdlib> 
#include <cstring> 
#include <iostream> 
#include <boost/asio.hpp> 

using boost::asio::ip::tcp; 

enum { max_length = 1024 }; 

class TCPIP 
{ 
     private: 

      boost::asio::io_service io_service; 
      tcp::resolver resolver; 
      tcp::resolver::query query; 
      tcp::resolver::iterator iterator; 
      tcp::socket s; 

     public: 

     TCPIP():resolver(io_service), 
     query("127.0.0.1", "2345"), 
     iterator(resolver.resolve(query)), 
     s(io_service), 
     boost::asio::connect(s, iterator) 
     {} 
     ~TCPIP(){} 
     void IO() 
     { 
      std::cout << "Enter message: "; 
      char request[max_length]; 
      std::cin.getline(request, max_length); 
      size_t request_length = std::strlen(request); 
      boost::asio::write(s, boost::asio::buffer(request, request_length)); 

      char reply[max_length]; 
      size_t reply_length = boost::asio::read(s, 
      boost::asio::buffer(reply, request_length)); 
      std::cout << "Reply is: "; 
      std::cout.write(reply, reply_length); 
      std::cout << "\n"; 
     } 
}; 
#endif 

,我得到這些錯誤

c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\boost\asio\detail\config.hpp|205|warning: #warning Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately.| 
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\boost\asio\detail\config.hpp|206|warning: #warning For example, add -D_WIN32_WINNT=0x0501 to the compiler command line.| 
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\boost\asio\detail\config.hpp|207|warning: #warning Assuming _WIN32_WINNT=0x0501 (i.e. Windows XP target).| 
C:\Documents and Settings\My Documents\project5\erlang_connect\TCPIP.h||In constructor 'TCPIP::TCPIP()':| 
C:\Documents and Settings\My Documents\project5\erlang_connect\TCPIP.h|26|error: expected class-name before '(' token| 
C:\Documents and Settings\My Documents\project5\erlang_connect\TCPIP.h|26|error: expected '{' before '(' token| 
C:\Documents and Settings\My Documents\project5\erlang_connect\erlang_connect.cpp||In function 'int main()':| 
C:\Documents and Settings\My Documents\project5\erlang_connect\erlang_connect.cpp|7|error: expected primary-expression before ';' token| 
C:\Documents and Settings\My Documents\project5\erlang_connect\erlang_connect.cpp|5|warning: unused variable 'INTERFACE'| 
||=== Build finished: 3 errors, 4 warnings ===| 

基本上問題涉及到初始化列表,並宣稱boost::asio::connect(s, iterator)問題。這是用於實現此目的的原始Boost源代碼(boost阻塞tcp-client)。我嘗試使用指針,但增強庫不喜歡這個想法!

// 
// blocking_tcp_echo_client.cpp 
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
// 
// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) 
// 
// Distributed under the Boost Software License, Version 1.0. (See accompanying 
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 
// 

#include <cstdlib> 
#include <cstring> 
#include <iostream> 
#include <boost/asio.hpp> 

using boost::asio::ip::tcp; 

enum { max_length = 1024 }; 

int main(int argc, char* argv[]) 
{ 
    try 
    { 
    if (argc != 3) 
    { 
     std::cerr << "Usage: blocking_tcp_echo_client <host> <port>\n"; 
     return 1; 
    } 

    boost::asio::io_service io_service; 

    tcp::resolver resolver(io_service); 
    tcp::resolver::query query(tcp::v4(), argv[1], argv[2]); 
    tcp::resolver::iterator iterator = resolver.resolve(query); 

    tcp::socket s(io_service); 
    boost::asio::connect(s, iterator); 

    using namespace std; // For strlen. 
    std::cout << "Enter message: "; 
    char request[max_length]; 
    std::cin.getline(request, max_length); 
    size_t request_length = strlen(request); 
    boost::asio::write(s, boost::asio::buffer(request, request_length)); 

    char reply[max_length]; 
    size_t reply_length = boost::asio::read(s, 
     boost::asio::buffer(reply, request_length)); 
    std::cout << "Reply is: "; 
    std::cout.write(reply, reply_length); 
    std::cout << "\n"; 
    } 
    catch (std::exception& e) 
    { 
    std::cerr << "Exception: " << e.what() << "\n"; 
    } 

    return 0; 
} 
+0

請解釋一下你的意思是多線條,那些只是那裏,使其更易於閱讀。我不認爲它有任何功能。 – pandoragami 2013-02-23 16:16:03

回答

2

在初始化程序列表中,表達式需要調用父類成員的構造函數。要解決這個問題,只需將boost::asio::connect()移至構造函數主體。

TCPIP() 
    : resolver(io_service),    // calls resolver constructor 
    query("127.0.0.1", "2345"),  // calls query constructor 
    iterator(resolver.resolve(query)), // calls iterator constructor 
    s(io_service)      // calls socket constructor 
{ 
    boost::asio::connect(s, iterator); 
} 

另外,還要考慮解析器,查詢和迭代器是否被需要的是整個TCPIP對象的生命週期進行訪問。這可能是值得擁有它們是TCPIP的構造函數中自動變量,從而導致類似:

TCPIP() 
    : s(io_service) 
{ 
    tcp::resolver resolver(io_service); 
    tcp::resolver::iterator iterator = 
    resolver.resolve(tcp::resolver::query(("127.0.0.1", "2345")); 
    boost::asio::connect(s, iterator); 
}