[英]Issue with nested templated classes
我正在嘗試使用模板化的類創建一個簡單的堆棧。 當一個類調用另一個類的構造函數時,似乎出現了問題。
#include <iostream>
#include <vector>
int g_MaxSize = 100;
template <class T>
class Stack;
template <class D>
class Node
{
private:
D data;
public:
Node(D value): data(value)
{
}
template <class T>
friend class Stack;
};
template <class T>
class Stack
{
private:
std::vector<Node<T>> stack;
int top;
public:
Stack(): stack(g_MaxSize), top(0)
{
}
void push(T val)
{
// make sure stack isnt full
stack[top++]= Node<T>(val);
}
Node<T> pop()
{
return stack[top--];
}
Node<T> peek()
{
return stack[top];
}
};
int main() {
Node<int> testNode(1) // *this works*
Stack<int> myStack;
myStack.push(3);
return 0;
}
錯誤是“沒有匹配的構造器來初始化'Node'”。 如上面的代碼所示,Node構造函數可以單獨工作,但通過Stack類完成時則不能工作。
vector
的參數需要默認的構造函數。 Node
缺少一個,因此出錯。
在這里你的問題是stack(g_MaxSize)
在Stack(): stack(g_MaxSize), top(0)
正在請求您構建g_MaxSize
默認構造Node
在矢量s。 但是,由於Node
無法默認構造,因此您無法執行此操作。
您可以向Node
添加默認的構造函數來解決該問題。 另一種方法是將默認Node
傳遞給矢量構造函數,例如stack(g_MaxSize, Node<T>(1))
。 最后,您可以創建大小為零的向量,然后在構造函數主體中調用reserve
來為Node
分配存儲,而無需構造它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.