小编Chr*_*ley的帖子

协变返回类型,常量和不完整的类

此代码在g ++ 6.1下成功编译,但在clang 3.8中出错:

class C;

class Base {
public:
  virtual const C *getC();
};

class Derived : public Base {
public:
  virtual       C *getC();
};
Run Code Online (Sandbox Code Playgroud)

clang的错误如下:

$ dev/compilers/linux-x86_64-2.12.2/clang3.8/bin/clang++ -Wall -c testcovariantreturn.cxx
testcovariantreturn.cxx:10:20: error: return type of virtual function 'getC' is not covariant with the return type of the function it overrides ('C' is incomplete)
Run Code Online (Sandbox Code Playgroud)

如果完全定义了C类而不是前向声明,则没有错误.我的理解是,当覆盖虚方法时,协变允许"较小"的cv限定(即,从返回类型中删除const).

clang是否正确/允许需要完整类型,如果是,为什么?怎么可以在这里改变C的定义呢?

这不是完全学术性的,在大型代码库中我不愿意添加不必要的包含,我们尝试将声明转发为标准实践.

c++ covariance

16
推荐指数
1
解决办法
629
查看次数

使用JNI/C++代码中的java套接字

我有一个java应用程序,它创建一个与服务器进程通信的套接字,例如new java.net.Socket(String host,int port).这个应用程序包含一堆遗留的c ++代码,需要从该服务器吸取大量数据并对其进行处理.这是通过让本机代码创建自己的套接字并连接到服务器来实现的,例如:

sock = socket(AF_INET, SOCK_STREAM, 0);
struct hostent* hp = gethostbyname(host);
if (!hp)
{
  unsigned long addr = inet_addr(host);
  hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET);
}

struct sockaddr_in name;
name.sin_family = AF_INET;
memcpy(&name.sin_addr, hp->h_addr, hp->h_length);
name.sin_port = htons(port);

connect(sock, (sockaddr*)&name, sizeof(name));
Run Code Online (Sandbox Code Playgroud)

在具有多个NIC(例如有线和wifi或VPN连接)的Windows vista/7计算机上,这两个套接字最终可能会有不同的本地地址.java代码似乎选择了"更好"的界面(有线Gb enet =更高的MTU?),本机(天真?)代码获得"默认"界面(坚持在USB设备中,它成为您的默认设置 - yuck) .

这给我带来了一些问题,我不认为细节是相关的.两个问题:

  1. 我可以从JNI代码中重用java套接字(可移植吗?假设是Sun JDK).这将完全避免这个问题,但到目前为止,我没有看到任何方式与JNI /本机代码中的java.net.Socket进行交互.

  2. 由于第一个问题的答案可能是NO,java如何创建该套接字(选择接口)?代码片段受到欢迎.我在openjdk的东西环顾四周,并没有找到我想要的东西.

谢谢,克里斯

c++ java sockets java-native-interface

10
推荐指数
1
解决办法
7159
查看次数

g ++ 6.1编译时回归?

与g ++ 4.8.3相比,下面的代码需要永远(好吧,长时间)在g ++ 6.1.0中进行编译.这是编译器错误吗?或者代码中有些愚蠢的东西?(愚蠢比使用固定和showpoint没有浮点值...).

g ++ 4.8:

$ time~/dev/compilers/linux-x86_64-2.10.1/gnu4.8.3/bin/g ++ -D_REENTRANT -fPIC -Wall -Wextra -Wno-unused-parameter -Werror -Wno-unused-local-typedefs -m64 - Woverloaded-virtual -Wno-deprecated -fvisibility-inlines-hidden -fvisibility = hidden -std = c ++ 11 -c ostreamtest.cpp

真正的0m0.451s

g ++ 6.1:

$ time~/dev/compilers/linux-x86_64-2.10.1/gnu6.1.0/bin/g ++ -D_REENTRANT -fPIC -Wall -Wextra -Wno-unused-parameter -Werror -Wno-unused-local-typedefs -m64 - Woverloaded-virtual -Wno-deprecated -fvisibility-inlines-hidden -fvisibility = hidden -std = c ++ 11 -c ostreamtest.cpp

真正的15m36.033s

ostreamtest.cpp:

#include <iostream>
#include <iomanip>
#include <ostream>

typedef long long int64;

class IOStreamWrapper
{
public:
  /// get/set …
Run Code Online (Sandbox Code Playgroud)

c++ g++

8
推荐指数
1
解决办法
145
查看次数

static_cast到base析构函数的指向派生类的安全性

这是使用C++中的Static_cast进行Downcasting的问题的变体,以及使用static_cast(或reinterpret_cast)进行无效向下转换的安全性,无需添加成员

我不清楚标准"B实际上是D类对象的子对象的短语,结果指针指向类型D的封闭对象"关于~B中的行为.如果你在~B中转换为D,那么它仍然是一个子对象吗?以下简单示例显示了以下问题:

void f(B* b);

class B {
public:
  B() {}
  ~B() { f(this); }
};

class D : public B { public: D() {} };

std::set<D*> ds;

void f(B* b) {
  D* d = static_cast<D*>(b);  // UB or subobject of type D?
  ds.erase(d);
}
Run Code Online (Sandbox Code Playgroud)

我知道演员是一个敞开大门的灾难,从dtor做这样的事情是一个坏主意,但同事声称"代码是有效的,并且工作正常.这个演员是完全有效的.评论明确指出它不应该被解除引用".

我指出演员阵容是不必要的,我们应该更喜欢类型系统提供的评论.令人遗憾的是,他是高级/首席开发人员之一,也是一位理想的c ++"专家".

我可以告诉他演员阵容是UB吗?

c++ casting static-cast language-lawyer

6
推荐指数
1
解决办法
1129
查看次数

3D场景文件格式和查看器

我正在寻找一个跨平台的解决方案,用于保存和查看3D场景(工程仿真模型和结果的可视化)但是(仍然)似乎没有那么多.

我差不多10年前研究了这个问题,然后决定使用VRML(并开始了最终转向OpenVRML的项目).不幸的是,VRML/X3D在过去十年中并没有变得无处不在.

理想情况下,解决方案将提供一个C++库,可以将其插入到某个级别的3D渲染管道中,以将3D场景捕获到文件中; 和一个可自由再分发的查看器,允许视图操作,部分隐藏,注释,尺寸标注等.至少应支持linux,mac和windows.

3D PDF似乎可以满足大多数观看者的要求,但Adobe sdk显然只能在Windows上使用.

有什么建议 ?

c++ 3d file-format cross-platform vrml

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