C++ 在 GCC 上使用已删除的函数,但在 MSVC 上没有
Posted
技术标签:
【中文标题】C++ 在 GCC 上使用已删除的函数,但在 MSVC 上没有【英文标题】:C++ use of deleted function on GCC but not on 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 & io_service);
我错了什么?这是 GCC 错误吗?
【问题讨论】:
【参考方案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) 。许多事情正在发生变化,它们已被弃用,其他功能是新的。如果你想要最新的更新,你应该使用最新的标准,如果你的软件有可能被弃用的代码,那么你必须使用创建它的标准。
【讨论】:
以上是关于C++ 在 GCC 上使用已删除的函数,但在 MSVC 上没有的主要内容,如果未能解决你的问题,请参考以下文章
错误:在 gcc 5.2.0 中使用已删除的函数 bool regex_match
无法理解 C 源代码,它不能在 GCC 中编译,但在 Visual C++ 中