błąd :: make_unique nie jest członkiem „std”

92

Próbuję skompilować następujący program puli wątków opublikowany w przeglądzie kodu, aby go przetestować.

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

Ale otrzymuję błędy

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 ‘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
źródło
1
Jakiego kompilatora używasz?
Matteo Italia
3
Jakiego kompilatora / flag używasz? make_uniquejest funkcją języka c ++ 14
MatthiasB,
najprawdopodobniej nie masz do tego kodu, ponieważ nie jest on częścią C ++ 11?
Alexander Oh,
On w jakiś sposób używa funkcji c ++ 14, a ty nie.
BЈовић
byłaby implementacja make_unique. to nie takie trudne;) msdn.microsoft.com/en-us/library/dn439780.aspx
Alexander Oh

Odpowiedzi:

143

make_uniqueto nadchodząca funkcja C ++ 14 i dlatego może nie być dostępna w Twoim kompilatorze, nawet jeśli jest zgodna z C ++ 11.

Możesz jednak łatwo toczyć własną implementację:

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

(FYI, tutaj jest ostateczna wersja tego,make_unique która została wybrana w C ++ 14. Obejmuje to dodatkowe funkcje do obsługi tablic, ale ogólna idea jest nadal taka sama).

ComicSansMS
źródło
6
@ ali786 Zależy od Twojego kompilatora. Na przykład w GCC przekazujesz -std=c++1ywiersz poleceń.
Angew nie jest już dumny z SO
1
@ ali786 Być może GCC 4.8.1 nie obsługuje tej części C ++ 14? Czy skonsultowałeś się z jego dokumentacją? BTW, najnowsza wersja GCC to 4.9.0 .
Angew nie jest już dumny z SO
3
@ ali786 Właściwie to nie jest cechą samego kompilatora, ale raczej standardową implementacją biblioteki (którą najprawdopodobniej w twoim przypadku jest libstdc ++ ). Afaik, wsparcie dla tej konkretnej funkcji zostało dodane tylko w gcc 4.9.0 (jak również sugeruje ten post ).
ComicSansMS
1
@VictorEijkhout Tak, dosłownie . Możesz zebrać minimalny przykład i opublikować nowe pytanie, jeśli masz problemy z uruchomieniem go. (I fyi, możesz ująć tekst w
odwrotne znaczniki,
1
Mam gcc 5.4 i nadal otrzymuję ten błąd, nawet gdy wypróbowuję wszystkie wymienione tutaj flagi.
Timothy Swan
16

Jeśli masz najnowszy kompilator, możesz zmienić następujące ustawienia w ustawieniach kompilacji:

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

To działa dla mnie.

Anil8753
źródło
1
Jest to specyficzne dla GCC / Clang i może nie działać dla innych kompilatorów.
tambre
7

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

Jagger Yu
źródło
1

Zdarza mi się to podczas pracy z XCode (używam najnowszej wersji XCode w 2019 ...). Używam CMake do integracji kompilacji. Użycie następującej dyrektywy w CMakeLists.txt naprawiło to za mnie:

set(CMAKE_CXX_STANDARD 14).

Przykład:

cmake_minimum_required(VERSION 3.14.0)
set(CMAKE_CXX_STANDARD 14)

# Rest of your declarations...
kovac
źródło
1

Jeśli utkniesz w c ++ 11 , możesz pobrać make_uniquez abseil-cpp , kolekcji bibliotek C ++ typu open source pobranych z wewnętrznej bazy kodu Google.

Alex Cohn
źródło
0

W moim przypadku musiałem zaktualizować std = c ++

Mam na myśli to, że w moich aktach było to

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

Zmieniłem tę linię

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

Otóż ​​to...

Aleksey Timoshchenko
źródło