继承std :: stack会导致clang出错但可以使用gcc

时间:2015-11-10 09:19:30

标签: c++ templates c++11 inheritance stack

无关。请参阅下面的更新。 我一直在玩std :: stack并注意到一些奇怪的东西。这是代码:

.h文件

template<typename Tp> using VecOfRef = std::vector<std::reference_wrapper<Tp>>;

template <typename T>
struct Stack : public std::stack<T,VecOfRef<T>> {};

struct Simple {
    std::string txt = "txt";
};

.cpp文件

int main () {

    Simple smpl;

    auto vec = VecOfRef<Simple>{std::ref(smpl)};
    auto stdStack = std::stack<Simple,decltype(vec)>(vec); //works fine
    auto myStack = Stack<Simple>(vec); //error

    //to check if a reference is stored
    stdStack.push(smpl);
    smpl.txt.append("append");
    Simple& r = sStack.top();
    cout << r.txt << endl;

    return 0;
}

错误消息显示:

  

19:   函数式转换没有匹配的转换   “的std :: __ 1 ::载体,   std :: __ 1 :: allocator&gt; &GT;”至   '堆栈'

更新

我一直在玩这个并设法让代码工作:

#include <vector>
#include <string>
#include <stack>
#include <iostream>
#include <functional>

template<typename Tp> using VecOfRef = std::vector<std::reference_wrapper<Tp>>;

template <typename T>
class Stack : public std::stack<T,VecOfRef<T>> {
public:
    using std::stack<T,VecOfRef<T>>::stack;
    using std::stack<T,VecOfRef<T>>::c;

    T& top() {

        return c.back().get();
    }
};


struct Simple {
    std::string txt = "txt";
    void print() { std::cout << txt << std::endl; }
};


int main() {

    Simple smpl;
    Simple smpl_2;
    Simple smpl_3;

    VecOfRef<Simple> vr {smpl,smpl_2,smpl_3};

//    auto myStack = Stack<Simple> (vr); // error
    auto myStack = Stack<Simple> ({smpl,smpl_2,smpl_3}); // ok
    auto stk = std::stack<Simple,std::vector<std::reference_wrapper<Simple>>>(vr); // ok_2

    smpl.txt.append("_append");
    smpl_2.txt.append("_append_2");
    smpl_3.txt.append("_append_3");

    myStack.top().print(); // txt_append_3
    myStack.pop();
    myStack.top().print(); // txt_append_2
    myStack.pop();
    myStack.top().print(); // txt_append

    return 0;
}

它在gcc下编译,但不在clang下。错误说:

  

错误:堆栈:154:43:'std :: __ 1 :: enable_if'中没有名为'type'的类型; 'enable_if'不能用于禁用此声明

堆叠文件中的行:error at line

2 个答案:

答案 0 :(得分:1)

也许原因是你错过了一个构造函数

template <typename T>
struct Stack : public std::stack<T,VecOfRef<T>> 
{
    Stack(VecOfRef<T>){}
};

答案 1 :(得分:0)

您没有为Stack课程添加任何构造函数。

如果要继承std:stack的构造函数,则必须使用以下命令指定: 你班上的using std::stack<T,VecOfRef<T>>::stack;