小编Mar*_*rco的帖子

什么"实例化......从这里需要"是什么意思?

我收到以下编译器¹消息

main.cpp: In instantiation of ‘void fkt(Foo) [with Foo = int]’:
main.cpp:5:7:   required from here
Run Code Online (Sandbox Code Playgroud)

无论如何都会创建二进制文件,所以这不是错误.但它也没有被标记为警告.这是什么信息,为什么我会得到它?

我将代码缩减为以下示例

template <typename Foo>
void fkt(Foo f) {}

int main() {
  fkt(1);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

¹ 的gcc 4.7.2

编辑:这里重现的步骤:

% cat main.cpp
template <typename Foo>
void fkt(Foo f) {}

int main() {
  fkt(1);
  return 0;
}
% g++ -Wall  -Wextra main.cpp
main.cpp: In instantiation of ‘void fkt(Foo) [with Foo = int]’:
main.cpp:5:7:   required from here
main.cpp:2:6: warning: unused parameter ‘f’ [-Wunused-parameter]
Run Code Online (Sandbox Code Playgroud)

c++ templates

15
推荐指数
1
解决办法
1万
查看次数

首次调用后,读取UDP套接字会丢弃剩余字节

我的目标是分两步从UDP套接字读取数据.问题是如果我向套接字写入的数据多于第一步中读取的数据.结果是剩下的数据消失了.

我将代码缩减为以下代码段:

#include <boost/asio/ip/udp.hpp>
using namespace boost::asio;

int main() {
  io_service net_io;
  ip::udp::socket net_sock( net_io, ip::udp::endpoint( ip::udp::v4(), 1234 ) );

  uint8_t data[2];

  net_sock.receive( buffer( data, 2 ) );
  std::cout << data[0] << data[1] << std::endl;

  net_sock.receive( buffer( data, 2 ) );
  std::cout << data[0] << data[1] << std::endl;


  net_sock.close();
  return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

当我将数据写入套接字时,如下所示:

echo '0123456789' | nc -u localhost 1234
Run Code Online (Sandbox Code Playgroud)

程序输出前两个字节01然后阻塞.相反,我期望输出:

01
23
Run Code Online (Sandbox Code Playgroud)

但是,它在第​​二次receive()通话时阻止.根据 手册:

该调用将阻塞,直到满足下列条件之一为止:

∙提供的缓冲区已满.[...]
∙发生错误.

为什么缓冲区为空?如果我发射

echo '0123456789' | nc -u localhost …
Run Code Online (Sandbox Code Playgroud)

c++ udp boost-asio

5
推荐指数
1
解决办法
1272
查看次数

标签 统计

c++ ×2

boost-asio ×1

templates ×1

udp ×1