web-dev-qa-db-fra.com

error :: make_unique n'est pas membre de 'std'

J'essaie de compiler le programme de pool de threads suivant publié sur la révision de code pour le tester.

https://codereview.stackexchange.com/questions/55100/platform-independant-thread-pool-v4

Mais je reçois les erreurs

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 ‘std’
 auto ptr1 = std::make_unique<unsigned>();
             ^
main.cpp:9:34: error: expected primary-expression before ‘unsigned’
 auto ptr1 = std::make_unique<unsigned>();
                              ^
main.cpp:14:17: error: ‘make_unique’ is not a member of ‘std’
 auto ptr2 = std::make_unique<unsigned>();
             ^
main.cpp:14:34: error: expected primary-expression before ‘unsigned’
 auto ptr2 = std::make_unique<unsigned>();
67
Ali786

make_unique est un fonctionnalité C++ 14 à venir et pourrait donc ne pas être disponible sur votre compilateur, même s'il est conforme à C++ 11.

Vous pouvez cependant facilement lancer votre propre implémentation:

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

(Pour info, voici la version finale de make_unique qui a été voté en C++ 14. Cela inclut des fonctions supplémentaires pour couvrir les tableaux, mais l’idée générale reste la même.)

116
ComicSansMS

Si vous avez le dernier compilateur, vous pouvez modifier les éléments suivants dans vos paramètres de construction:

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

Cela fonctionne pour moi.

14
Anil8753

Version 1.gcc> = 5
2.CXXFLAGS + = -std = c ++ 14
3. #include <mémoire>

3
Jagger Yu

Cela m’arrive lorsque je travaille avec XCode (j’utilise la version la plus récente de XCode en 2019 ...). J'utilise, CMake pour l'intégration de la construction. Utiliser la directive suivante dans CMakeLists.txt l'a corrigé pour moi:

set(CMAKE_CXX_STANDARD 14).

Exemple:

cmake_minimum_required(VERSION 3.14.0)
set(CMAKE_CXX_STANDARD 14)

# Rest of your declarations...
0
swdon

Dans mon cas J'avais besoin de mettre à jour le std = c ++

Je veux dire dans mon dossier était-ce

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"
            }
        }
       ....
    }

J'ai changé cette ligne

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"
            }
        }
       ....
    }

C'est ça...

0