此代码在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的定义呢?
这不是完全学术性的,在大型代码库中我不愿意添加不必要的包含,我们尝试将声明转发为标准实践.
我有一个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) .
这给我带来了一些问题,我不认为细节是相关的.两个问题:
我可以从JNI代码中重用java套接字(可移植吗?假设是Sun JDK).这将完全避免这个问题,但到目前为止,我没有看到任何方式与JNI /本机代码中的java.net.Socket进行交互.
由于第一个问题的答案可能是NO,java如何创建该套接字(选择接口)?代码片段受到欢迎.我在openjdk的东西环顾四周,并没有找到我想要的东西.
谢谢,克里斯
与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++中的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吗?
我正在寻找一个跨平台的解决方案,用于保存和查看3D场景(工程仿真模型和结果的可视化)但是(仍然)似乎没有那么多.
我差不多10年前研究了这个问题,然后决定使用VRML(并开始了最终转向OpenVRML的项目).不幸的是,VRML/X3D在过去十年中并没有变得无处不在.
理想情况下,解决方案将提供一个C++库,可以将其插入到某个级别的3D渲染管道中,以将3D场景捕获到文件中; 和一个可自由再分发的查看器,允许视图操作,部分隐藏,注释,尺寸标注等.至少应支持linux,mac和windows.
3D PDF似乎可以满足大多数观看者的要求,但Adobe sdk显然只能在Windows上使用.
有什么建议 ?
c++ ×5
3d ×1
casting ×1
covariance ×1
file-format ×1
g++ ×1
java ×1
sockets ×1
static-cast ×1
vrml ×1