error :: make_unique no es miembro de 'std'

92

Estoy tratando de compilar el siguiente programa de grupo de subprocesos publicado en la revisión del código para probarlo.

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

Pero estoy recibiendo los errores

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
fuente
1
Qué compilador estas usando?
Matteo Italia
3
¿Qué compilador / banderas usas? make_uniquees una función de C ++ 14
MatthiasB
lo más probable es que no tenga el código para ello ya que no es parte de c ++ 11?
Alexander Oh
Él está usando de alguna manera las características de C ++ 14, y usted no.
BЈовић
habría una implementación de make_unique. no es tan difícil;) msdn.microsoft.com/en-us/library/dn439780.aspx
Alexander Oh

Respuestas:

143

make_uniquees una característica de C ++ 14 próxima y, por lo tanto, podría no estar disponible en su compilador, incluso si es compatible con C ++ 11.

Sin embargo, puede implementar fácilmente su propia implementación:

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

(Para su información, aquí está la versión finalmake_unique que se votó en C ++ 14. Esto incluye funciones adicionales para cubrir matrices, pero la idea general sigue siendo la misma).

ComicSansMS
fuente
6
@ ali786 Depende de su compilador. Con GCC, por ejemplo, pasa -std=c++1yla línea de comando.
Angew ya no está orgulloso de SO
1
@ ali786 ¿Quizás GCC 4.8.1 no es compatible con esta parte de C ++ 14? ¿Has consultado su documentación? Por cierto, el último GCC es 4.9.0 .
Angew ya no está orgulloso de SO
3
@ ali786 En realidad, esta no es una característica del compilador en sí, sino más bien de la implementación de la biblioteca estándar (que probablemente sea libstdc ++ en su caso). Afaik, el soporte para esta característica en particular solo se agregó con gcc 4.9.0 (como también lo sugiere esta publicación ).
ComicSansMS
1
@VictorEijkhout Sí, literalmente . Es posible que desee armar un ejemplo mínimo y publicar una nueva pregunta si tiene problemas para que se ejecute. (Y para su información, puede incluir texto entre comillas invertidas `para que se muestre como código en los comentarios)
ComicSansMS
1
Tengo gcc 5.4 y sigo recibiendo este error incluso cuando intento todas las banderas mencionadas aquí.
Timothy Swan
16

Si tiene el compilador más reciente, puede cambiar lo siguiente en su configuración de compilación:

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

Esto funciona para mi.

Anil8753
fuente
1
Esto es específico de GCC / Clang y puede que no funcione para otros compiladores.
tambre
7

1.gcc versión> = 5
2.CXXFLAGS + = -std = c ++ 14
3. #include <memoria>

Jagger Yu
fuente
1

Esto me sucede mientras trabajo con XCode (estoy usando la versión más actual de XCode en 2019 ...). Estoy usando CMake para la integración de compilación. El uso de la siguiente directiva en CMakeLists.txt lo solucionó para mí:

set(CMAKE_CXX_STANDARD 14).

Ejemplo:

cmake_minimum_required(VERSION 3.14.0)
set(CMAKE_CXX_STANDARD 14)

# Rest of your declarations...
kovac
fuente
1

Si está atascado con c ++ 11 , puede obtener make_uniquede abseil-cpp , una colección de código abierto de bibliotecas de C ++ extraída de la base de código interna de Google.

Alex Cohn
fuente
0

En mi caso , necesitaba actualizar std = c ++

Quiero decir, en mi archivo gradle estaba esto

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

Cambié esta línea

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

Eso es...

Aleksey Timoshchenko
fuente