Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译器错误:‘;std::数组<>;::~数组()’;被隐式删除_C++_Templates_Compiler Errors - Fatal编程技术网

C++ 编译器错误:‘;std::数组<>;::~数组()’;被隐式删除

C++ 编译器错误:‘;std::数组<>;::~数组()’;被隐式删除,c++,templates,compiler-errors,C++,Templates,Compiler Errors,我有以下.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

我有以下
.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
使用以下命令编译上述代码时:

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
            ^~~~~
在main.cpp:1:0中包含的文件中:
code.hpp:在“stack_array::stack_array(T&)[with T=int;C=std::vector;K=stack]”的实例化中:
main.cpp:8:35:从这里开始需要
code.hpp:52:86:错误:使用已删除的函数“std::array::~array()”
模板堆栈数组::堆栈数组(T&\U数据){
^
在code.hpp:3:0中包含的文件中,
来自main.cpp:1:
/usr/lib/gcc/x86_64-pc-cygwin/7.4.0/include/c++/array:94:12:注意:“std::array:::~array()”被隐式删除,因为默认定义的格式可能不正确:
结构体数组
^~~~~

为什么调用
std::array
的析构函数是因为
stack\u array::stack\u 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 ;
};
模板
类堆栈
{
C桩;
堆栈();
~stack();
无效推力(T&);
友元类栈_数组;
模板友元类std::数组;
};
演示:

消息说:
std::array::~array()已被隐式删除…

所以你有一个
std::array
stack
std::array
应该能够删除
stack
或者它的析构函数是private=>数组的析构函数被隐式删除


因此,您必须将其公开或交给朋友,以使其可被
std::array
访问。

这是有意的…堆栈ctor()是否从friend类stack_array中调用?如果
数组
析构函数无法访问其中项的析构函数,您认为该析构函数如何工作?更多详细信息:假设观察结果是正确的,,,,我为stack类去掉了析构函数,但该类做得并不多,并且错误消失了…如果您没有这样做的话显式删除析构函数,在这种情况下将有一个隐式定义的(公共)析构函数(这使
std::array
happy)。如果显式删除析构函数,则会出现相同的错误。我没有使用=delete显式删除析构函数,而是让编译器通过删除声明和定义来为堆栈定义默认析构函数。这样就消除了错误。
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 ;
};