errore :: make_unique non è un membro di "std"


92

Sto cercando di compilare il seguente programma di pool di thread pubblicato sulla revisione del codice per testarlo.

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

Ma sto ottenendo gli errori

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
Che compilatore stai usando?
Matteo Italia

3
Quale compilatore / flag usi? make_uniqueè una funzionalità di c ++ 14
MatthiasB

molto probabilmente non hai il codice perché non fa parte di c ++ 11?
Alexander Oh

In qualche modo sta usando le funzionalità di c ++ 14, e tu no.
BЈовић

ci sarebbe un'implementazione di make_unique. non è così difficile;) msdn.microsoft.com/en-us/library/dn439780.aspx
Alexander Oh

Risposte:


143

make_uniqueè una funzionalità imminente di C ++ 14 e quindi potrebbe non essere disponibile nel compilatore, anche se è conforme a C ++ 11.

Tuttavia, puoi facilmente eseguire la tua implementazione:

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

(Cordiali saluti, ecco la versione finalemake_unique che è stata votata in C ++ 14. Ciò include funzioni aggiuntive per coprire gli array, ma l'idea generale è sempre la stessa.)


6
@ ali786 Dipende dal tuo compilatore. Con GCC, ad esempio, si passa -std=c++1yla riga di comando.
Angew non è più orgoglioso di SO

1
@ ali786 Forse GCC 4.8.1 non supporta questa parte di C ++ 14? Hai consultato i suoi documenti? A proposito, l'ultimo GCC è 4.9.0 .
Angew non è più orgoglioso di SO

3
@ ali786 In realtà, questa non è una caratteristica del compilatore stesso, ma piuttosto dell'implementazione della libreria standard (che molto probabilmente è libstdc ++ nel tuo caso). Inoltre, il supporto per questa particolare funzionalità è stato aggiunto solo con gcc 4.9.0 (come suggerito anche da questo post ).
ComicSansMS

1
@VictorEijkhout Sì, letteralmente . Potresti voler mettere insieme un esempio minimo e pubblicare una nuova domanda se hai problemi a farlo funzionare. (E a proposito, puoi racchiudere il testo tra virgolette `per farlo visualizzare come codice nei commenti)
ComicSansMS

1
Ho gcc 5.4 e ricevo ancora questo errore anche quando provo tutti i flag menzionati qui.
Timothy Swan

16

Se hai il compilatore più recente, puoi modificare quanto segue nelle impostazioni di build:

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

Questo funziona per me.


1
Questo è specifico di GCC / Clang e potrebbe non funzionare per altri compilatori.
tambre

7

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


1

Questo mi succede mentre lavoro con XCode (sto usando la versione più recente di XCode nel 2019 ...). Sto usando CMake per l'integrazione della build. L'utilizzo della seguente direttiva in CMakeLists.txt lo ha risolto per me:

set(CMAKE_CXX_STANDARD 14).

Esempio:

cmake_minimum_required(VERSION 3.14.0)
set(CMAKE_CXX_STANDARD 14)

# Rest of your declarations...

1

Se sei bloccato con c ++ 11 , puoi ottenere make_uniqueda abseil-cpp , una raccolta open source di librerie C ++ tratte dal codice base interno di Google.


0

Nel mio caso era necessario aggiornare lo std = c ++

Voglio dire, nel mio file gradle c'era questo

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

Ho cambiato questa linea

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

Questo è tutto...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.