GLM和原子(g ++ 4.8)

时间:2014-06-30 15:31:30

标签: c++ linux gcc g++ glm-math

我几天前从Windows切换到了Linux,到目前为止很喜欢它。不幸的是我在移植项目时遇到了问题。在那里,我使用GLM进行矢量计算和原子一起使用。在Visual Studio上一切正常。

我遇到的第一个问题是,出于某种原因,只要我包含undefined referece to标题,g ++ 4.6就会给我一个atomic。然后我切换到g ++ 4.8,问题就消失了。但现在,只要我使用带有这样的矢量的原子:atomic<vec3>,我就会遇到一个新问题。这就是g ++所说的:

/usr/include/c++/4.8/atomic|167|error: function ‘std::atomic<_Tp>::atomic() [with _Tp = glm::detail::tvec3<float>]’ defaulted on its first declaration with an exception-specification that differs from the implicit declaration ‘std::atomic<glm::detail::tvec3<float> >::atomic()’|

我不知道如何解决这个问题。我想尝试g ++ 4.9,但我甚至不知道怎么做到这一点。这是一个简单的代码,在我的机器上崩溃:

#include <iostream>
#include <glm.hpp>
#include <atomic>

using namespace std;
using namespace glm;

atomic<vec3> b;
int main(){
    cout << "hello" << endl;

    return 0;
}

我使用Code :: Blocks作为IDE。当我使用clang++时,我得到的错误与g ++ 4.6相同。

1 个答案:

答案 0 :(得分:1)

看起来tvec3<float>不适合制作std::atomic 您需要检查tvec3<float>是否实际满足TriviallyCopyable概念中给出的所有约束:

<强>要求

  • 琐碎的复制构造函数
  • 琐碎的移动构造函数
  • 琐碎的副本分配操作员
  • 琐碎移动分配操作员
  • 琐碎的析构者
  • 没有虚拟功能或虚拟基类
  • 所有(非静态)成员和基类都是TriviallyCopyable

否则使用单独的std::mutex来保护容器免受并发访问。