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>();

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


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.


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>


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

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.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.