2014-04-16 21 views
2

以下內容在msvc上編譯,而不是在gcc上編譯。爲什麼?C++在GCC上使用已刪除的函數但在MSVC上不使用

game_tracker.cpp:

#include "stdafx.hpp" 
#include "game_tracker.hpp" 
#include "basic_game_server.hpp" 
#include "basic_session.hpp" 
#include "api_session.hpp" 
#include "protocols.hpp" 

using namespace boost::asio; 
using namespace std; 

namespace games_zone{ 

    game_tracker::game_tracker(unsigned short port) : tracker_(io_service(thread::hardware_concurrency())), 
     api_(io_service(thread::hardware_concurrency())), 
     acceptor_(api_, ip::tcp::endpoint(ip::tcp::v4(), port), false), 
     socket_(api_) 
    { 
     tracker_work_ = new boost::asio::io_service::work(tracker_); 
     api_work_ = new boost::asio::io_service::work(api_); 

     protocols::hl_game_server gs(boost::asio::ip::address_v4::from_string("89.44.246.184"), 27015); 
     add(gs); 
    } 

    ... 
} 

game_tracker.hpp:

#pragma once 

#include "basic_game_server.hpp" 

namespace games_zone{ 
    class game_tracker : 
     private boost::noncopyable 
    { 
    public: 
     game_tracker(unsigned short); 
     ~game_tracker(); 
     void run(); 
    private: 
     boost::asio::io_service tracker_; 
     boost::asio::io_service api_; 
     boost::asio::ip::tcp::acceptor acceptor_; 
     boost::asio::ip::tcp::socket socket_; 
     boost::asio::io_service::work* tracker_work_; 
     boost::asio::io_service::work* api_work_; 
     std::vector<basic_game_server*> servers_; 

     void add(basic_game_server&); 
     void do_accept(); 
    }; 
} 

GCC錯誤:

[email protected]:~/gz_tracker/build# make 
Scanning dependencies of target gz_tracker 
[ 16%] Building CXX object games_zone/CMakeFiles/gz_tracker.dir/game_tracker.cpp.o 
/root/gz_tracker/games_zone/game_tracker.cpp: In constructor ‘games_zone::game_tracker::game_tracker(short unsigned int)’: 
/root/gz_tracker/games_zone/game_tracker.cpp:16:15: error: use of deleted function ‘boost::asio::io_service::io_service(const boost::asio::io_service&)’ 
    socket_(api_) 
      ^
In file included from /usr/local/include/boost/asio/basic_io_object.hpp:19:0, 
       from /usr/local/include/boost/asio/basic_socket.hpp:20, 
       from /usr/local/include/boost/asio/basic_datagram_socket.hpp:20, 
       from /usr/local/include/boost/asio.hpp:21, 
       from /root/gz_tracker/games_zone/stdafx.hpp:10, 
       from /root/gz_tracker/games_zone/game_tracker.cpp:1: 
/usr/local/include/boost/asio/io_service.hpp:185:7: note: ‘boost::asio::io_service::io_service(const boost::asio::io_service&)’ is implicitly deleted because the default definition would be ill-formed: 
class io_service 
    ^
In file included from /usr/local/include/boost/asio/io_service.hpp:23:0, 
       from /usr/local/include/boost/asio/basic_io_object.hpp:19, 
       from /usr/local/include/boost/asio/basic_socket.hpp:20, 
       from /usr/local/include/boost/asio/basic_datagram_socket.hpp:20, 
       from /usr/local/include/boost/asio.hpp:21, 
       from /root/gz_tracker/games_zone/stdafx.hpp:10, 
       from /root/gz_tracker/games_zone/game_tracker.cpp:1: 
/usr/local/include/boost/asio/detail/noncopyable.hpp:32:3: error: ‘boost::asio::detail::noncopyable::noncopyable(const boost::asio::detail::noncopyable&)’ is private 
    noncopyable(const noncopyable&); 
^
In file included from /usr/local/include/boost/asio/basic_io_object.hpp:19:0, 
       from /usr/local/include/boost/asio/basic_socket.hpp:20, 
       from /usr/local/include/boost/asio/basic_datagram_socket.hpp:20, 
       from /usr/local/include/boost/asio.hpp:21, 
       from /root/gz_tracker/games_zone/stdafx.hpp:10, 
       from /root/gz_tracker/games_zone/game_tracker.cpp:1: 
/usr/local/include/boost/asio/io_service.hpp:185:7: error: within this context 
class io_service 
    ^
/root/gz_tracker/games_zone/game_tracker.cpp:16:15: error: use of deleted function ‘boost::asio::io_service::io_service(const boost::asio::io_service&)’ 
    socket_(api_) 
      ^
make[2]: *** [games_zone/CMakeFiles/gz_tracker.dir/game_tracker.cpp.o] Error 1 
make[1]: *** [games_zone/CMakeFiles/gz_tracker.dir/all] Error 2 
make: *** [all] Error 2 

我使用升壓1.55(當前版本),並編譯和運行微軟Visual Studio 2013. 我明白這個錯誤api_無法綁定到explicit basic_stream_socket(boost::asio::io_service & io_service);

我錯了什麼?這是一個GCC錯誤?

回答

7

在這兩條線:

tracker_(io_service(thread::hardware_concurrency())), 
api_(io_service(thread::hardware_concurrency())), 

你創建一個臨時io_service並將其複製到你的成員變量(這是不允許的,因爲拷貝構造函數是私有的)。

儘量只

tracker_(thread::hardware_concurrency()), 
api_(thread::hardware_concurrency()), 
+0

謝謝。我是否認爲這個錯誤對此沒有太大的幫助? –

+1

這些錯誤非常有用。 (1)您正在使用已刪除的構造函數io_service(io_service&)。 (2)構造函數被刪除,因爲定義不合格。 (3)由於顯式不可複製,io_service(io_service&)是私有的。 – etheranger

+0

從那裏,只需使用該複製構造函數查找代碼(錯誤地)的地方。 – etheranger