【问题标题】:C++ use of deleted function on GCC but not on MSVCC++ 在 GCC 上使用已删除的函数,但在 MSVC 上没有
【发布时间】:2014-04-16 07:45:44
【问题描述】:

以下是在 msvc 而不是 gcc 上编译的。为什么?

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 错误:

root@ubuntu:~/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

我使用 boost 1.55(当前版本)并在 Microsoft Visual Studio 2013 上编译和运行。 我从这个错误中了解到api_ 无法绑定到explicit basic_stream_socket(boost::asio::io_service &amp; io_service);

我错了什么?这是 GCC 错误吗?

【问题讨论】:

    标签: c++ gcc boost


    【解决方案1】:

    这两行:

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

    您正在创建一个临时的 io_service 并将其复制到您的成员变量中(这是不允许的,因为复制构造函数是私有的)。

    试试吧

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

    【讨论】:

    • 谢谢。我的错误没有太大帮助是对的吗?
    • 这些错误很有帮助。 (1) 您正在使用已删除的构造函数 io_service(io_service&)。 (2) 构造函数被删除,因为定义格式不正确。 (3) io_service(io_service&) 是私有的,因为它是明确不可复制的。
    • 从那里,只需使用该复制构造函数查找代码所在的位置(错误地)。
    • 你是对的,但是第一条错误信息告诉我看socket_(api_)
    • @AdrianMunteanu:错误只是指向整个构造函数定义。你可以试试 clang 是否会在这方面做得更好。经常这样。
    【解决方案2】:

    检查您选择的 C++ 标准是否相同。在调试模式和发布模式下。可能类型、函数或命名空间未在所选 C++ 标准上实现或存在。

    就我而言,我有以下错误(示例):

    • 'std::literals' 尚未声明

    using namespace std::literals::string_literals;
    

    • std::random_device 出现“使用已删除函数”错误{}

    std::random_device device = std::random_device{}  
    

    就我而言

    • 调试模式 -std=c++17
    • 发布模式 -std=c++14(由于 C++14 中缺少函数、类型或名称空间而导致的错误/您需要 C++17。)大量错误。

    发布模式更改为 C++17。一切正常,0 个错误 0 个警告。

    选择 2017 c ++ 标准不是强制性的,您必须选择您喜欢或必要的标准之一,该标准已经实现了您项目所需的所有功能。

    更新 通过远程 Linux 编译在 Clion Windows 2018.3 上测试。

    使用 -std=c++11

    使用 -std=c++17

    C++ 是一个不断发展的标准:2003 年之后是 2011 年 (C++11),然后是 2014 年 (C++14),现在我们有了 2017 年 (C++17),我们正在为 2020 年 (C++ 20) 。许多事情正在发生变化,它们已被弃用,其他功能是新的。如果你想要最新的更新,你应该使用最新的标准,如果你的软件有可能被弃用的代码,那么你必须使用创建它的标准。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      相关资源
      最近更新 更多