2017-11-02 8 views
0

Visual Studio 2013で動作するコードがあります。これでVisual Studio 2017で同じコードを作成しようとしています。ここに私がしようとしているコードです。これによりアトミックC++の削除された関数を参照しようとしています

#include <array> 
#include <atomic> 

int main() 
{ 

    using TrdRobotStateArray = std::array<std::atomic<double>, 6>; 
    TrdRobotStateArray mCurrentPose = { 0.3 }; 
    printf("%0.3f", mCurrentPose[0]); 
    return 0; 
} 

、私はこのエラーを取得する:

error C2280: 'std::atomic<double>::atomic(const std::atomic<double> &)': attempting to reference a deleted function 

私はこのコードを書いていない、と私はアトミック変数に読み込むしようとしています。しかし、私はまだ、エラーで何が起こっているのかはまだよく分かりません。アトミックについての説明は非常に高く評価されます。ありがとう!

更新:ここ

このコードに付属のすべてのエラーと警告があります。それは将来他人を助けるでしょう。

1>AtomicTest.cpp 
1>AtomicTest.cpp(13): error C4839: non-standard use of class 
'std::atomic<double>' as an argument to a variadic function 
1>AtomicTest.cpp(13): note: the constructor and destructor will not be 
called; a bitwise copy of the class will be passed as the argument 
1>AtomicTest.cpp(11): note: see declaration of 'std::atomic<double>' 
1>AtomicTest.cpp(13): error C2280: 'std::atomic<double>::atomic(const 
std::atomic<double> &)': attempting to reference a deleted function 
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Professional\VC\Tools\MSVC\14.11.25503\include\atomic(689): 
note: see declaration of 'std::atomic<double>::atomic' 
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Professional\VC\Tools\MSVC\14.11.25503\include\atomic(689): 
note: 'std::atomic<double>::atomic(const std::atomic<double> &)': function 
was explicitly deleted 
1>AtomicTest.cpp(13): warning C4477: 'printf' : format string '%0.3f' 
requires an argument of type 'double', but variadic argument 1 has type 
'std::atomic<double>' 
1>Done building project "AtomicTest.vcxproj" -- FAILED. 
+0

実際には、このコードで最初に表示されるエラーメッセージは、エラーC4839:クラス 'std :: atomic 'を非標準的なバリデーション関数の引数として使用しています。どのようにコンパイラを呼び出すのですか? –

+0

P .:最新のバージョンのVisual C++ 2017に、改善されたエラーメッセージが追加されたと思います。https://docs.microsoft.com/en-us/cpp/cpp-conformance-improvements-2017を参照してください。最新のバージョンにアップグレードすることをお勧めします。 –

+0

はい、私はそのエラーも受け取りますが、Jodocusの修正を適用するとすぐに消えてしまいました。私はそれについて心配する必要がありますか? –

答えて

2

は、あなたはそれをコンパイルするために明示的に値をロードする必要があります。

printf("%0.3d", mCurrentPose[0].load()); 

そうでない場合は、それが明確に意図されていない)(printfのためにアトミック変数自身をコピーしようとします。

+0

ありがとうございます。教育目的のため。 'mCurrentPose [0]'がコピーコンストラクタを呼び出すのはなぜですか?原子オブジェクトを使用する利点は何ですか? –

+0

btw、 '%f'は浮動小数値を出力するために使われ、' mCurrentPose [0] 'は浮動小数点ではありません。 – mnciitbhu

+0

あなたは正しいです、私は今それを変更しました。 –

2

アトミック変数がコピーコンストラクトではありません。

これはC++標準の要件であるため、VisualStudio 2017は正しいです。

関連する問題