c++ - 编译器错误:'std::array<...>::~array()' 被隐式删除
问题描述
我有以下.hpp
文件:
#ifndef CODE_HPP
#define CODE_HPP
#include <array>
#include <vector>
using std::vector;
using std::array;
template<typename T, typename C = vector<T>>
class stack;
template<typename T, typename C = vector<T>, typename K = stack<T,C>>
class stack_array;
template<typename T, typename C>
class stack
{
C pile;
stack();
~stack();
void push(T&);
friend class stack_array<T,C,stack<T,C>>;
};
template<typename T, typename C, typename K>
class stack_array
{
private:
static const size_t max_elem = 10;
array<K, max_elem> store{};
size_t index;
public:
stack_array(T&);
~stack_array();
};
template<typename T, typename C> stack<T,C>::stack(){
pile.clear();
}
template<typename T, typename C> stack<T,C>::~stack(){
}
template<typename T, typename C> void stack<T,C>::push(T& _data){
pile.push_back(_data);
return;
}
template<typename T, typename C, typename K> stack_array<T,C,K>::stack_array(T& _data){
index = 0;
store[index].push(_data);
}
template<typename T, typename C, typename K> stack_array<T,C,K>::~stack_array(){
}
#endif
我的.cpp
文件复制如下:
#include "code.hpp"
#include <iostream>
using std::cout;
int main (void){
auto i = 0;
stack_array<decltype(i)> s_a(i);
return 0;
}
当使用以下命令编译上述代码时:
g++ -ggdb -std=c++17 -Wall main.cpp code.hpp
我收到以下编译错误:
In file included from main.cpp:1:0:
code.hpp: In instantiation of ‘stack_array<T, C, K>::stack_array(T&) [with T = int; C = std::vector<int, std::allocator<int> >; K = stack<int, std::vector<int, std::allocator<int> > >]’:
main.cpp:8:35: required from here
code.hpp:52:86: error: use of deleted function ‘std::array<stack<int, std::vector<int, std::allocator<int> > >, 10>::~array()’
template<typename T, typename C, typename K> stack_array<T,C,K>::stack_array(T& _data){
^
In file included from code.hpp:3:0,
from main.cpp:1:
/usr/lib/gcc/x86_64-pc-cygwin/7.4.0/include/c++/array:94:12: note: ‘std::array<stack<int, std::vector<int, std::allocator<int> > >, 10>::~array()’ is implicitly deleted because the default definition would be ill-formed:
struct array
^~~~~
为什么std::array
因为里面的代码而被调用的析构函数stack_array<T,C,K>::stack_array()?
解决方案
你应该加std::array
为好友
template<typename T, typename C>
class stack
{
C pile;
stack();
~stack();
void push(T&);
friend class stack_array<T,C,stack<T,C>>;
template< class TT, std::size_t N> friend class std::array ;
};
演示:https ://wandbox.org/permlink/TxAyRCvrwj9CtOhV
消息说:std::array<stack<int, std::vector<int, std::allocator<int> > >, 10>::~array()’ is implicitly deleted...
所以你有一个std::array
of stack<smt>
,std::array
应该可以删除stack
或者它的析构函数是私有的=>数组的析构函数被隐式删除。
因此,您必须std::array
通过将其公开或成为朋友来使其易于访问。
推荐阅读
- excel - 带有显示警报的 VBA 删除工作表 False 仍然从另一个工作簿发出警报
- powershell - Powershell xaml RichText 窗口未实时更新
- python - 答案只是在 python 中打印 .0 而不是 .00
- symfony - 在 symfony 项目的 LDAP 连接后向用户添加角色
- arrays - 数组下标超出范围在 SAS 中的行错误
- android - 如何检查字符串是否只有一个指定字符?
- r - 替换 htmltools::tag 的属性值
- c# - 学习 .net core 3.1 - 第一次尝试使用 API webservice
- r - 为什么汇总函数不会出错?
- c++ - 有没有办法在已建立的 for 循环框(C++)中创建菜单