Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::带有自定义类的原子(C+;+;11)_C++_Xcode_C++11_Atomic - Fatal编程技术网

C++ std::带有自定义类的原子(C+;+;11)

C++ std::带有自定义类的原子(C+;+;11),c++,xcode,c++11,atomic,C++,Xcode,C++11,Atomic,我在库中使用std::atomic和一个自定义类。MSVC一切正常,但现在我正试图让它在macOS上运行,我遇到了一个链接器错误: 架构x86_64的未定义符号: “原子存储”,引用自: _主音中的主音 我已经创建了一些测试代码来复制它 #include <iostream> #include <atomic> using namespace std; class Vec { public: int x, y, z; Vec() { x = y

我在库中使用std::atomic和一个自定义类。MSVC一切正常,但现在我正试图让它在macOS上运行,我遇到了一个链接器错误:

架构x86_64的未定义符号: “原子存储”,引用自: _主音中的主音

我已经创建了一些测试代码来复制它

#include <iostream>
#include <atomic>

using namespace std;

class Vec {
    public:
    int x, y, z;
    Vec() { x = y = z = 0; }
};

std::atomic<Vec> x;


int main()
{
  Vec a;
  x = a;
  cin.get();
    return 0;
}
#包括
#包括
使用名称空间std;
Vec类{
公众:
int x,y,z;
Vec(){x=y=z=0;}
};
std::原子x;
int main()
{
Vec a;
x=a;
cin.get();
返回0;
}
当然,这个例子没有多大意义,但它是我能想到的最短的例子。它确实在VS2012中运行,但不在xcode中运行(上面显示了链接器错误)

发生了什么事?我在这里滥用std::atomic吗?我正在使用的库是多线程的,用于音频处理。因此,如果我没有以正确的方式使用std::atomic,它就不会真正显示出来,因为性能非常好,而且我没有任何线程问题。或者xcode可能缺少什么

更新:

我检查了andrey的答案,因为它包含了最多的信息,尽管这三个答案都很有用。我不是这方面的专家(显然),但VS2012似乎超出了C++11应该实现的范围

那么如何从这里开始呢?我看到了一些选择

  • 不要在这个类中使用原子。在我的特殊情况下,这将是非常困难的,因为我的向量类在所有代码中都被使用。锁定和解锁互斥锁可能会大大降低速度
  • 自己为atomic实现函数。我觉得这很复杂。我将把它保存为最后一个选项
  • 看看是否可以用boost::atomic做些什么。乍一看,这似乎有效。不过我还得做更多的测试

  • clang编译器设置中的项目页面中检查正在使用的标准库。 它应该是GNU支持c++11的libstdc++或libc++

    希望能有所帮助。

    如中所述:

    标准库提供了std::atomic的完整专门化 以下类型的模板:

    1) bool类型及其typedef的一个专门化
    2) 整型的专门化和typedef
    3)std::atomic 对于所有指针类型

    那么Boost.Atomic呢。如中所述:

    使用非POD类作为模板参数来生成原子结果 未定义的行为


    std::atomic
    只要求类型可以简单地复制,OP中显示的类可以简单地复制。请注意,“提供完全专门化”并不意味着不支持其他类型,只是它们不是通过专门化实现的。通用模板
    std::atomic
    处理可复制的类型。数字类型的专门化提供了不适用于任意用户定义类型的附加成员函数(如算术运算)。但这难道不意味着如果忽略构造函数,示例应该链接吗?如果我把它注释掉,我仍然会得到同样的错误。对于gcc(从4.7开始),您可以尝试添加-std=c++11Btw,boost::atomic版本也会给我这个链接器错误。在本例中,找不到Boost::atomics::detail::lockpool::scoped_lock::scoped_lock(void const volatile*)的符号,谢谢。最好检查这些设置。虽然在这种情况下这不是问题,主要是因为这些设置在xcode 4.6中似乎是标准的,我在mac上检查了你的程序,得到了相同的错误。。。我现在不知道。看起来像是标准库中的一个bug或不受支持的功能它可能还不受支持。