error :: make_unique không phải là thành viên của 'std'


92

Tôi đang cố gắng biên dịch chương trình nhóm chủ đề sau được đăng trên đánh giá mã để kiểm tra nó.

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

Nhưng tôi đang nhận lỗi

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

1
Bạn đang sử dụng trình biên dịch nào?
Matteo Italia

3
Bạn sử dụng trình biên dịch / cờ nào? make_uniquelà một c ++ 14 tính năng
MatthiasB

rất có thể bạn không có mã cho nó vì nó không phải là một phần của c ++ 11?
Alex,

Anh ấy bằng cách nào đó đang sử dụng các tính năng c ++ 14, còn bạn thì không.
BЈовић

sẽ có một triển khai của make_unique. nó không phải là khó khăn;) msdn.microsoft.com/en-us/library/dn439780.aspx
Alex

Câu trả lời:


143

make_uniquelà một tính năng C ++ 14 sắp ra mắt và do đó có thể không có sẵn trên trình biên dịch của bạn, ngay cả khi nó tuân thủ C ++ 11.

Tuy nhiên, bạn có thể dễ dàng triển khai triển khai của riêng mình:

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, đây là phiên bản cuối cùng củamake_unique nó đã được bình chọn thành C ++ 14. Điều này bao gồm các chức năng bổ sung để bao gồm các mảng, nhưng ý tưởng chung vẫn giống nhau.)


6
@ ali786 Phụ thuộc vào trình biên dịch của bạn. Ví dụ, với GCC, bạn truyền -std=c++1ydòng lệnh.
Angew không còn tự hào về SO

1
@ ali786 Có lẽ GCC 4.8.1 không hỗ trợ phần này của C ++ 14? Bạn đã tham khảo tài liệu của nó chưa? BTW, GCC mới nhất là 4.9.0 .
Angew không còn tự hào về SO

3
@ ali786 Trên thực tế, đây không phải là một tính năng của chính trình biên dịch, mà là của việc triển khai thư viện tiêu chuẩn (rất có thể là libstdc ++ trong trường hợp của bạn). Afaik, hỗ trợ cho tính năng cụ thể này chỉ được thêm vào với gcc 4.9.0 (cũng như được đề xuất bởi bài đăng này ).
ComicSansMS

1
@VictorEijkhout Có, theo nghĩa đen . Bạn có thể muốn tổng hợp một ví dụ tối thiểu và đăng một câu hỏi mới nếu bạn gặp khó khăn khi chạy nó. (Và FYI, bạn có thể gửi kèm theo văn bản trong backticks `để làm cho nó hiển thị dưới dạng mã trong ý kiến)
ComicSansMS

1
Tôi có gcc 5.4 và tôi vẫn gặp lỗi này ngay cả khi tôi thử tất cả các cờ được đề cập ở đây.
Timothy Swan

16

Nếu bạn có trình biên dịch mới nhất, bạn có thể thay đổi những điều sau trong cài đặt bản dựng của mình:

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

Điều này làm việc cho tôi.


1
Điều này dành riêng cho GCC / Clang và có thể không hoạt động với các trình biên dịch khác.
tambre

7

1. phiên bản gcc> = 5
2.CXXFLAGS + = -std = c ++ 14
3. #include <memory>


1

Điều này xảy ra với tôi khi làm việc với XCode (Tôi đang sử dụng phiên bản XCode mới nhất vào năm 2019 ...). Tôi đang sử dụng, CMake để tích hợp xây dựng. Sử dụng lệnh sau trong CMakeLists.txt đã sửa lỗi đó cho tôi:

set(CMAKE_CXX_STANDARD 14).

Thí dụ:

cmake_minimum_required(VERSION 3.14.0)
set(CMAKE_CXX_STANDARD 14)

# Rest of your declarations...

1

Nếu bạn gặp khó khăn với c ++ 11 , bạn có thể lấy make_uniquetừ abseil-cpp , một bộ sưu tập mã nguồn mở của các thư viện C ++ được rút ra từ cơ sở mã nội bộ của Google.


0

Trong trường hợp của tôi, tôi cần cập nhật std = c ++

Ý tôi là trong tệp gradle của tôi có cái này

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

Tôi đã thay đổi dòng này

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

Đó là nó...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.