我几天前从 Windows 切换到 Linux,到目前为止非常喜欢它。不幸的是,我在移植我的项目时遇到了问题。在那里,我将 GLM 用于 vector 计算和原子运算。在 Visual Studio 上一切正常。
我遇到的第一个问题是,出于某种原因,g++ 4.6 给了我一个 undefined referece to
我一包括atomic
header 。然后我切换到 g++ 4.8,问题就消失了。但是现在,一旦我使用带有这样一个 vector 的原子: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 相同的错误。
最佳答案
看起来像tvec3<float>
不适合制作 std::atomic .
您需要检查是否 tvec3<float>
实际上满足 TriviallyCopyable
给出的所有限制条件理念:
要求
- 普通复制构造函数
- 简单的移动构造函数
- 普通复制赋值运算符
- 平凡的移动赋值运算符
- 平凡的析构函数
- 没有虚函数或虚基类
- 所有(非静态)成员和基类都是 TriviallyCopyable
否则使用单独的 std::mutex
保护容器免受并发访问。
关于c++ - G++ 4.8 中的 GLM 和原子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24493752/