J'essaie de compiler le programme de pool de threads suivant publié sur la revue de code pour le tester.
/codereview/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>();
c++
c++11
compiler-errors
c++14
unique-ptr
Ali786
la source
la source
make_unique
est une fonctionnalité c ++ 14Réponses:
make_unique
est une fonctionnalité C ++ 14 à venir et peut donc ne pas être disponible sur votre compilateur, même s'il est compatible C ++ 11.Vous pouvez cependant facilement rouler 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ée en C ++ 14. Cela inclut des fonctions supplémentaires pour couvrir les tableaux, mais l'idée générale est toujours la même.)la source
-std=c++1y
la ligne de commande.Si vous avez le dernier compilateur, vous pouvez modifier ce qui suit dans vos paramètres de construction:
C++ Language Dialect C++14[-std=c++14]
Cela fonctionne pour moi.
la source
1.gcc version> = 5
2.CXXFLAGS + = -std = c ++ 14
3. #include <memory>
la source
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 build. L'utilisation de 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...
la source
Si vous êtes coincé avec c ++ 11 , vous pouvez obtenir
make_unique
de abseil-cpp , une collection open source de bibliothèques C ++ tirées de la base de code interne de Google.la source
Dans mon cas, il fallait mettre à jour le std = c ++
Je veux dire dans mon dossier de graduation é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...
la source