错误:‘make_unique’不是‘std’的成员

本文针对C++14特性make_unique在GCC6.1及更早版本中缺失的问题,提供了一种自制解决方案。通过条件编译检查GCC版本,当版本低于6.2时,自定义了一个make_unique函数,确保了C++14标准下unique_ptr的创建功能在旧编译器上也能正常使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//如果gcc 小于6.1  不支持c++14 那么make_unique不支持,  自定义个一个也是可以玩的

    #ifdef __GNUC__
        #ifdef __GNUC_MINOR__
            #if ((__GNUC__ < 6)) || ((__GNUC__ == 6) &&  (__GNUC_MINOR__<2))

            namespace std 
            {
                template<typename T, typename... Ts>
                std::unique_ptr<T> make_unique(Ts&&... params)
                {
                    return std::unique_ptr<T>(new T(std::forward<Ts>(params)...));
                }
            }
            #endif

        #endif // __GNUC_MINOR__
    
    #endif // __GNUC__

 

 

问题的原因是make_unique为C++14才特有的, 如果使用小于6.2得gcc编译就会报错, vs2015  msvc 也可以

`std::unique_ptr` 和 `std::make_unique` 是 C++11 引入的智能指针和辅助函数,用于管理动态分配的内存,避免内存泄漏。以下是它们的用法介绍: ### std::unique_ptr `std::unique_ptr` 是一个独占所有权的智能指针,它负责管理动态分配的对象,并在其生命周期结束时自动释放内存。`std::unique_ptr` 不能被复制,但可以被移动。 #### 基本用法 ```cpp #include <iostream> #include <memory> class MyClass { public: MyClass() { std::cout << "MyClass constructor\n"; } ~MyClass() { std::cout << "MyClass destructor\n"; } void doSomething() { std::cout << "Doing something\n"; } }; int main() { // 创建一个 std::unique_ptr 对象 std::unique_ptr<MyClass> ptr(new MyClass()); // 使用智能指针 ptr->doSomething(); // 无需手动释放内存 return 0; } ``` #### 移动语义 ```cpp #include <iostream> #include <memory> int main() { std::unique_ptr<int> ptr1(new int(10)); std::unique_ptr<int> ptr2 = std::move(ptr1); // 移动所有权 if (!ptr1) { std::cout << "ptr1 is empty\n"; } if (ptr2) { std::cout << "ptr2 has value: " << *ptr2 << "\n"; } return 0; } ``` ### std::make_unique `std::make_unique` 是一个辅助函数,用于简化 `std::unique_ptr` 的创建过程。它返回一个 `std::unique_ptr` 对象,并确保异常安全。 #### 基本用法 ```cpp #include <iostream> #include <memory> class MyClass { public: MyClass() { std::cout << "MyClass constructor\n"; } ~MyClass() { std::cout << "MyClass destructor\n"; } void doSomething() { std::cout << "Doing something\n"; } }; int main() { // 使用 std::make_unique 创建一个 std::unique_ptr 对象 auto ptr = std::make_unique<MyClass>(); // 使用智能指针 ptr->doSomething(); // 无需手动释放内存 return 0; } ``` #### 优点 - **异常安全**:使用 `std::make_unique` 可以确保在对象构造过程中如果抛出异常,不会导致内存泄漏。 - **简洁**:代码更简洁,更易读。 ### 总结 `std::unique_ptr` 和 `std::make_unique` 提供了便捷且安全的方式来管理动态分配的内存,避免了手动管理内存的繁琐和潜在的内存泄漏问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值