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

92

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 ‘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>();
Ali786
la source
1
Quel compilateur utilisez-vous?
Matteo Italia
3
Quels compilateurs / indicateurs utilisez-vous? make_uniqueest une fonctionnalité c ++ 14
MatthiasB
vous n'avez probablement pas le code car il ne fait pas partie de c ++ 11?
Alexander Oh
Il utilise en quelque sorte les fonctionnalités de c ++ 14, et vous ne l'êtes pas.
BЈовић
il y aurait une implémentation de make_unique. ce n'est pas si difficile;) msdn.microsoft.com/en-us/library/dn439780.aspx
Alexander Oh

Réponses:

143

make_uniqueest 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 demake_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.)

ComicSansMS
la source
6
@ ali786 Dépend de votre compilateur. Avec GCC, par exemple, vous passez -std=c++1yla ligne de commande.
Angew n'est plus fier de SO
1
@ ali786 Peut-être que GCC 4.8.1 ne prend pas en charge cette partie de C ++ 14? Avez-vous consulté sa documentation? BTW, le dernier GCC est 4.9.0 .
Angew n'est plus fier de SO
3
@ ali786 En fait, ce n'est pas une fonctionnalité du compilateur lui-même, mais plutôt de l'implémentation de la bibliothèque standard (qui est probablement libstdc ++ dans votre cas). Afaik, le support de cette fonctionnalité particulière n'a été ajouté qu'avec gcc 4.9.0 (comme cela est également suggéré par ce post ).
ComicSansMS
1
@VictorEijkhout Oui, littéralement . Vous voudrez peut-être rassembler un exemple minimal et publier une nouvelle question si vous avez du mal à l'exécuter. (Et pour info, vous pouvez insérer du texte dans des backticks pour le faire afficher sous forme de code dans les commentaires)
ComicSansMS
1
J'ai gcc 5.4 et j'obtiens toujours cette erreur même lorsque j'essaye tous les drapeaux mentionnés ici.
Timothy Swan
16

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.

Anil8753
la source
1
Ceci est spécifique à GCC / Clang et peut ne pas fonctionner pour d'autres compilateurs.
tambre
7

1.gcc version> = 5
2.CXXFLAGS + = -std = c ++ 14
3. #include <memory>

Jagger Yu
la source
1

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...
kovac
la source
1

Si vous êtes coincé avec c ++ 11 , vous pouvez obtenir make_uniquede abseil-cpp , une collection open source de bibliothèques C ++ tirées de la base de code interne de Google.

Alex Cohn
la source
0

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

Aleksey Timoshchenko
la source