无关。请参阅下面的更新。 我一直在玩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'不能用于禁用此声明
答案 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;
。