Не могу скомпилировать с std :: atomic <int>в качестве члена класса - PullRequest
0 голосов
/ 16 января 2019

Я написал класс, в котором я хотел бы иметь атомное целое число, которое должно быть изначально установлено в -1.

#ifndef MIGRATINGTHREADS_VERTEX_H
#define MIGRATINGTHREADS_VERTEX_H

#include <set>
#include <atomic>

using namespace std;

class vertex{
public:
    vertex(){};
    int id;
    bool visited = false;
    std::set <int> adjacencyList;

private:
    static std::atomic<int> matched{-1};
};

#endif

Так как я установил matched на static Мне, очевидно, нужно было инициализировать его вне строки, как показано. Однако, когда я пытаюсь скомпилировать, используя g++ -std=c++14 -latomic, я получаю следующую ошибку:

/tmp/ccRJwQzu.o:(.data+0x0): multiple definition of `vertex::matched'
/tmp/ccp52lOu.o:(.data+0x0): first defined here
collect2: error: ld returned 1 exit status

Кроме того, если я попытаюсь выполнить инициализацию таким образом

class vertex{
public:
    vertex(){};
    int id;
    bool visited = false;
    std::set <int> adjacencyList;

private:
    static std::atomic<int> matched;
};

Я получаю следующие ошибки, относящиеся к атомным конструкторам

/usr/include/c++/7/bits/stl_construct.h:75:7: error: use of deleted function ‘vertex::vertex(vertex&&)’
     { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from getVGraph.h:12:0,
                 from vertexcentric.cpp:15:
vertex.h:13:7: note: ‘vertex::vertex(vertex&&)’ is implicitly deleted because the default definition would be ill-formed:
 class vertex{
       ^~~~~~
vertex.h:13:7: error: use of deleted function ‘std::atomic<int>::atomic(const std::atomic<int>&)’
In file included from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:100:0,
                 from vertexcentric.cpp:9:
/usr/include/c++/7/atomic:668:7: note: declared here
       atomic(const atomic&) = delete;

У меня есть только одно определение соответствия, однако компилятор считает, что существует несколько определений. Это проблема с атомарностью в качестве учеников или с моей инициализацией?

...