编译器错误:“std::array<...>::~array()' 被隐式删除

Compiler Error: ‘std::array<...>::~array()’ is implicitly deleted

提问人:Vinod 提问时间:7/23/2019 更新时间:7/23/2019 访问量:290

问:

我有以下文件:.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::arraystack_array<T,C,K>::stack_array()?

C++ 模板 编译器错误

评论

0赞 Vinod 7/23/2019
那是故意的......堆栈 ctor() 是从 friend 类中调用的stack_array
1赞 Sander De Dycker 7/23/2019
如果析构函数无法访问其中项的析构函数,您期望析构函数如何工作?更多详情 : en.cppreference.com/w/cpp/language/...array
0赞 Vinod 7/23/2019
假设观察是正确的,,,我摆脱了堆栈类的析构函数,无论如何它都没有做太多事情,错误消失了......
0赞 Sander De Dycker 7/23/2019
如果你没有显式删除析构函数,在这种情况下,将有一个隐式定义的(公共)析构函数(这让你高兴)。如果显式删除析构函数,则应收到相同的错误。std::array
0赞 Vinod 7/23/2019
我没有使用 =delete 显式删除析构函数;相反,只需让编译器通过完全删除声明和定义来定义堆栈的默认析构函数。这消除了错误。

答:

4赞 Martin Morterol 7/23/2019 #1

您应该添加为好友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::arraystack<smt>std::arraystack

因此,您必须通过公开或成为朋友来访问它。std::array