编译器不会使用 -std=c++11 编译智能指针
compiler won't compile smart pointer using -std=c++11
我正在尝试编译一个简单的共享指针声明,但使用 cmd 使用g++ -std=c++11 main.cpp -o main
,但由于某些原因它抛出一堆错误。我尝试在堆栈溢出上找到类似的问题,但没有一个与我的问题相匹配。
法典:
std::shared_ptr<int[]>array(new int[100]);
头文件:
#include<iostream>
#include<memory>
编译器版本: g++ (MinGW.org GCC-6.3.0-1( 6.3.0
错误:
In file included from c:mingwlibgccmingw326.3.0includec++bitsshared_ptr.h:52:0,
from c:mingwlibgccmingw326.3.0includec++memory:82,
from main.cpp:2:
c:mingwlibgccmingw326.3.0includec++bitsshared_ptr_base.h: In instantiation of 'std::__shared_ptr<_Tp, _Lp>::__shared_ptr(_Tp1*) [with _Tp1 = int; _Tp = int []; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]':
c:mingwlibgccmingw326.3.0includec++bitsshared_ptr.h:117:32: required from 'std::shared_ptr<_Tp>::shared_ptr(_Tp1*) [with _Tp1 = int; _Tp = int []]'
main.cpp:7:42: required from here
c:mingwlibgccmingw326.3.0includec++bitsshared_ptr_base.h:885:39: error: cannot convert 'int*' to 'int (*)[]' in initialization
: _M_ptr(__p), _M_refcount(__p)
^`
我是相对较新的,不知道此错误意味着什么。 任何建议都会有所帮助。
在C++17
之前,std::shared_ptr
不能处理动态分配的数组。升级您的编译器以支持C++17
您的代码将愉快地编译。
编辑:早期版本有一个解决方法。您可以使用:
std::shared_ptr<int> sp(new int[10], custom_deleter<int>{});
其中custom_deleter
将是一个用于释放分配的内存的函数。在这种情况下,简单的delete[]
(而不是shared_ptr
析构函数内部的隐式delete
(就足够了:
template< typename T >
struct custom_deleter
{
void operator ()(const T* arr)
{
delete[] arr;
}
};
但是由于您已经在使用C++11
,可以用lambda 表达式替换结构,这将简化代码:
std::shared_ptr<int> sp(new int[10], [](const int* arr){ delete[] arr; });
"无法转换..."error 是类型错误,表示您使用了错误的数据类型。在这种情况下,它特别告诉您std::shared_ptr<int[]>
的构造函数需要int (*)[]
参数类型,但您提供的参数类型为int *
。由于编译器不知道如何从int *
转换为int (*)[]
,因此您会收到此错误。
在任何情况下,您都不应该使用shared_ptr
来管理 C 样式数组。我建议切换到 STL 容器,无论是std::array<int, N>
还是std::vector<int>
,具体取决于您是否知道编译时的大小。如果您愿意,可以将任何 STL 容器类型放入智能指针中。
相关文章:
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 编译器不会使用 -std=c++11 编译智能指针
- 如何在 C++11 编译时构建具有递增值的整数成员的结构序列
- 无法用"-std=c++11"编译《你好世界》
- 为 freebsd 11 编译 gcc4.8.5 时出错: 错误: 未知类型名称 'choke'
- 如何使用Codelite 11.0.0编译静态库
- mingw:使用 -std=c++11 编译时找不到函数
- 如何在 ubuntu 12.10 中隐藏 g++ c++11 编译警告
- 用C++14编译器而不是C++11编译时,我的性能会提高吗
- Qmake 不使用 stdc++11 编译标志
- 为什么 std::stoi 和 std::array 不能使用 g++ c++11 编译
- Makefile C++11-编译为静态库
- 代码块中的C++11编译问题
- gcc在c++11编译中给出垃圾
- 如何告诉一个库是使用C++11编译的
- 使用makefile和c++11编译时出错
- c++ 11编译时组合两个字符串的最简单方法
- 用Visual Studio 11编译的可执行文件有什么特别之处,导致这些可执行文件不能在Windows XP上执行?
- c++ 11编译时调用printf的格式字符串字面值构造
- 如何在Xcode 8下用c++ 11编译一个项目