草庐IT

c++ - g++ -std=c++0x 和兼容性

我正在使用g++4.4在Linux上编译一个共享库。如果可以的话,我想在库中使用一些C++11功能,但我无法更新编译器的版本,也无法为我的库的用户要求任何特殊的编译器开关。我有两个问题,但找不到明确的答案。如果我使用-std=c++0x或-std=g++0x编译共享库,我是否可以保证使用我的库的程序不需要这些开关(前提是我没有头文件中的c++0x特性)?这似乎有效,但我不想在注册过程中遇到一些微妙的问题。g++4.4中的C++11标准库非常不完整。由于许多标准库仅包含头文件,而gnu的头文件通常充满版本ifdef,我认为可能有一种方法可以使用至少libstdc++中的头文件的更新版本。

c++ - .obj : fatal error LNK1107: invalid or corrupt file: cannot read at 0x6592

我正在尝试将.obj模型加载到我的C++opengl3代码中,但由于某种原因它给了我这个错误:1>正在链接...1>.\bunny.obj:fatalerrorLNK1107:无效或损坏的文件:无法在0x6592处读取我试图搜索类似的错误,但有关于.dll或.lib的错误。你能帮我解决这个问题吗?我也尝试过使用不同的obj模型,但它总是给我这个错误。 最佳答案 您正在尝试使用C++链接器加载您的对象模型(可能您刚刚将它添加到项目中,现在它正在尝试编译)。链接器可以处理.obj文件,但它等待它们成为“目标代码”文件(通常也有.obj扩

c++ - 将 shared_ptr 与多继承类一起使用

我有一个类继承了两个接口(interface):classMulti:publicIFoo,publicIBar{public:virtual~Multi();//FoopartvirtualvoidfooMethod();//...//BarpartvirtualvoidbarMethod();//...};不幸的是,这个类不能分解为每个接口(interface)的两个单独的类。事实上,在类实现中,这些实体(Foo和Bar)是紧密耦合的,但将来它们可能会分开。另一个类想要使用Multi类,有一个指向IFoo和IBar的指针:classClientClass{public:Client

c++ - 从 weak_ptr 泄漏原始指针的可移植 hack

我有一个由shared_ptr组成的对象结构,加上weak_ptr以避免循环。原始指针是不行的,因为boost::serialization在通过对象跟踪作为序列化时间进行反序列化时需要恢复共享指针和弱指针。对象生命周期模式很复杂(粒子模拟)但完全可以预测。每当我使用weak_ptr::lock()时,我确信指针仍然有效。通常,我使用lock().get(),因为我只需要在很短的时间内使用该对象。现在,lock().get()对性能有影响,因为它会增加共享计数(在lock()中),然后在不久之后减少它(临时shared_ptr被破坏)。这boost.develpost从2002年开始,

c++ - 从 int 到 shared_ptr 的隐式转换

考虑下面的代码:#include#includevoidf(std::shared_ptrsp){}templateautocall_f(FuncTypef,PtrTypep)->decltype(f(p)){returnf(p);}intmain(){f(0);//doesn'tworkforanyotherint!=0,thanks@Rupesh//call_f(f,0);//error,cannotconvertinttoshared_ptr}在main()中的第一行,整数0转换为std::shared_ptr和电话f(0)成功没有任何问题。但是,使用模板调用函数会使情况有所不同

c++ - std::weak_ptr:锁或 shared_ptr 构造函数?

似乎有两种方法可以暂时获取weak_ptr指向的资源的所有权:使用lock()将weak_ptr传递给shared_ptr构造函数这两者都会产生一个shared_ptr,如果weak_ptr为空并且锁返回一个nullptrshared_ptr构造函数抛出异常。所以问题是:什么时候应该使用一个或另一个?是否有与此相关的一般准则或最佳做法? 最佳答案 复制自http://en.cppreference.com/w/cpp/memory/weak_ptr/lockBoththisfunctionandtheconstructorofstd

c++ - std::exception_ptr 线程安全吗?

我有一个工作线程,它通过std::thread持续运行、创建和管理。在我的工作线程的顶层,我有一个try/catchblock,里面有一个while循环。如果异常泄漏到线程的顶层,我会捕获它并将其存储在std::exception_ptr中,它是还拥有非静态线程函数的类的成员://Inclassheader(insideclassdeclaration)std::exception_ptrm_threadException;//InclassCPPfilevoidMyClass::MyThreadFunction(){try{while(true){//Dothreadstuff}}c

c++ - c++0x 中的返回值是否将通过右值引用传递?

假设我有一个函数:typedefstd::vectorVecType;VecTyperandomVector();intprocessing(){VecTypev=randomVector();returnstd::accumulate(v.begin(),v.end(),0);}C++0x是否明确表示将从randomVector的返回值中避免虚假拷贝?或者编译器是否需要实现RVO?在我看来,值randomVector()应该被视为右值,因此应该调用v的移动构造函数,但我不完全确定这是真的。 最佳答案 规则如下如果编译器可以执行RV

c++ - 异步函数调用 C++0x

我正在使用来自http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.html的代码测试std::async函数intcalculate_the_answer_to_LtUaE(){sleep(5);coutthe_answer=std::async(calculate_the_answer_to_LtUaE);the_answer.get();cout我需要调用the_answer.get()来调用calculate_the_answer_

c++ - Opengl GL_QUADS 产生错误 0x506

我在OpenGL中有一些代码可以将YUV图像渲染到OpenGL视口(viewport)上。该程序在nvidia卡上运行时没有问题,但在IntelHD3000上运行时会产生错误,遗憾的是它是目标机器。代码中标记了产生错误的位置。着色器程序是//VertexShader#version120voidmain(){gl_TexCoord[0]=gl_MultiTexCoord0;gl_Position=gl_ModelViewProjectionMatrix*gl_Vertex;}//fragmentshader#version120uniformsampler2DtexY;uniforms