error :: make_uniqueは「std」のメンバーではありません


92

コードレビューに投稿された次のスレッドプールプログラムをコンパイルしてテストしようとしています。

/codereview/55100/platform-independant-thread-pool-v4

しかし、私はエラーが発生しています

threadpool.hpp: In member function ‘std::future<decltype (task((forward<Args>)(args)...))> threadpool::enqueue_task(Func&&, Args&& ...)’:
threadpool.hpp:94:28: error: ‘make_unique’ was not declared in this scope
     auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>>  (std::move(bound_task), std::move(promise));
                        ^
threadpool.hpp:94:81: error: expected primary-expression before ‘>’ token
     auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>>(std::move(bound_task), std::move(promise));
                                                                             ^
main.cpp: In function ‘int main()’:
main.cpp:9:17: error: ‘make_unique’ is not a member of ‘stdauto ptr1 = std::make_unique<unsigned>();
             ^
main.cpp:9:34: error: expected primary-expression before ‘unsignedauto ptr1 = std::make_unique<unsigned>();
                              ^
main.cpp:14:17: error: ‘make_unique’ is not a member of ‘stdauto ptr2 = std::make_unique<unsigned>();
             ^
main.cpp:14:34: error: expected primary-expression before ‘unsignedauto ptr2 = std::make_unique<unsigned>();

1
どのコンパイラを使用していますか?
Matteo Italia

3
どのコンパイラ/フラグを使用していますか?make_uniqueはc ++ 14の機能です
MatthiasB

それはc ++ 11の一部ではないので、おそらくあなたはそれのためのコードを持っていませんか?
アレクサンダーオハイオ州

彼はどういうわけかc ++ 14機能を使用していますが、あなたはそうではありません。
BЈовић

make_uniqueの実装があります。それほど難しいことではありません;)msdn.microsoft.com/en-us/library/dn439780.aspx
Alexander Oh

回答:


143

make_unique今後のC ++ 14機能であるため、C ++ 11に準拠している場合でも、コンパイラで使用できない可能性があります。

ただし、独自の実装を簡単にロールすることができます。

template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

(参考までに、これがC ++ 14に投票された最終バージョンですmake_unique。これには配列をカバーする追加の関数が含まれていますが、一般的な考え方は同じです。)


6
@ ali786コンパイラによって異なります。たとえば、GCCでは-std=c++1y、コマンドラインを渡します。
Angewはもはや誇りSOのではありません

1
@ ali786おそらくGCC4.8.1はC ++ 14のこの部分をサポートしていませんか?そのドキュメントを参照しましたか?ところで、最新のGCCは4.9.0です。
Angewはもはや誇りSOのではありません

3
@ ali786実際には、これはコンパイラ自体の機能ではなく、標準ライブラリの実装(あなたの場合はlibstdc ++である可能性が高い)の機能です。Afaik、この特定の機能のサポートはgcc 4.9.0でのみ追加されました(この投稿でも提案されています)。
ComicSansMS 2014

1
@VictorEijkhoutはい、文字通り。実行に問題がある場合は、最小限の例をまとめて新しい質問を投稿することをお勧めします。(そして、fyi、テキストをバッククォート `で囲んで、コメントのコードとして表示することができます)
ComicSansMS 2015

1
gcc 5.4を使用していますが、ここに記載されているすべてのフラグを試しても、このエラーが発生します。
ティモシースワン

16

最新のコンパイラを使用している場合は、ビルド設定で以下を変更できます。

 C++ Language Dialect    C++14[-std=c++14]

これは私にとってはうまくいきます。


1
これはGCC / Clangに固有であり、他のコンパイラでは機能しない可能性があります。
タンブル2017


1

これは、XCodeを使用しているときに発生します(2019年に最新バージョンのXCodeを使用しています...)。ビルド統合にCMakeを使用しています。CMakeLists.txtで次のディレクティブを使用すると、修正されました。

set(CMAKE_CXX_STANDARD 14)

例:

cmake_minimum_required(VERSION 3.14.0)
set(CMAKE_CXX_STANDARD 14)

# Rest of your declarations...


0

私の場合、std = c ++を更新する必要がありました

私のgradleファイルにはこれがありました

android {
    ...

    defaultConfig {
        ...

        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11", "-Wall"
                arguments "-DANDROID_STL=c++_static",
                        "-DARCORE_LIBPATH=${arcore_libpath}/jni",
                        "-DARCORE_INCLUDE=${project.rootDir}/app/src/main/libs"
            }
        }
       ....
    }

この行を変更しました

android {
    ...

    defaultConfig {
        ...

        externalNativeBuild {
            cmake {
                cppFlags "-std=c++17", "-Wall"   <-- this number from 11 to 17 (or 14)
                arguments "-DANDROID_STL=c++_static",
                        "-DARCORE_LIBPATH=${arcore_libpath}/jni",
                        "-DARCORE_INCLUDE=${project.rootDir}/app/src/main/libs"
            }
        }
       ....
    }

それでおしまい...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.