我是C ++模板的新手,并通过小编程学习它 我完全不理解什么是错的 这是代码。
using namespace std;
template<typename T>
void Reverse( node<T> *front);
template<typename T>
void Display( node<T> *front);
template<typename T>
class node
{
public:
T data;
node<T> *next;
node(){ next = NULL; }
node(const T& item, node<T> *nextnode = NULL )
{
data = item;
next = nextnode;
}
};
int main()
{
node<int> *front = NULL;
int size, no;
cout << "Enter the size of list ";
cin >> size;
for (int i = 1; i < size; i++)
{
cout << "Enter the " << i << " element " << endl;
cin >> no;
front = new node<int> ( no , front);
}
Reverse(front);
Display(front);
_getch();
return 0;
}
template<typename T>
void Reverse(node<T> *front)
{
node<T> *temp = front;
stack<T> s;
while (temp != NULL)
{
s.push(temp); // Pushing the address into stack
temp = temp->next;
}
temp = s.top();
front = temp;
s.pop();
while (!s.empty())
{
temp->next = s.top(); // Popping the address from stack.
s.pop();
temp = temp->next;
}
temp->next = NULL;
}
template<typename T>
void Display( node<T> *front)
{
node<T> *temp = front;
while (temp != NULL)
{
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
我正在跟踪两个函数的两个错误(错误1和2)(即反向()和显示()) 错误1)错误C2182:'反向':非法使用'void'类型
错误2)错误C2998:'int Reverse':不能是模板定义
错误3)错误C1903:无法从先前的错误中恢复;停止编译。
我已经尝试过每一件我能想到的事情。但无法成功。
答案 0 :(得分:0)
我同意在这种情况下错误消息不是非常有用。问题是当编译器看到
时template<typename T>
void Reverse( node<T> *front);
它还不知道node<T>
是什么。在声明 Reverse
后之前,不会声明该类模板。您可以通过在Reverse
的类模板声明之后移动两个函数模板声明(Display
和node<T>
)来解决此问题。
或者,您可以通过在{2}函数模板前面加node
来转发声明template <typename T> class node;
- 但这里没有理由进行前向声明。
一旦Reverse
和Display
声明知道node<T>
是什么,这两个都很好,你就会遇到下一个错误:
node<T> *temp = front;
stack<T> s;
s.push(temp);
s
是stack<T>
- 你只能将Ts
推到它上面,但是你试图推送node<T>*
。确保您为类模板提供了实际使用它的类型:
stack<node<T>*> s;
答案 1 :(得分:-1)
显示的代码存在多个问题。
using namespace std;
这是considered to be a bad programming practice。
template<typename T>
void Reverse( node<T> *front);
此时未声明模板node
。从文件的开头到结尾,您的C ++代码按顺序编译。此时,未定义node
模板。
template<typename T>
void Reverse(node<T> *front)
{
// ...
此模板函数在使用它的main()
之后定义。
必须在使用模板之前定义模板。同样,您的C ++代码按顺序编译,从文件的开头到结尾。必须在使用模板类和函数之前定义它们。
前向声明仅适用于普通的类和函数。虽然模板也可以向前声明,但它不会像您认为的那样工作。因此,在您更熟悉模板及其工作方式之前,您应该避免向前声明任何模板。