C ++:模板错误 - 非法使用'void'类型

时间:2016-05-10 12:03:18

标签: c++ templates

我是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:无法从先前的错误中恢复;停止编译。

我已经尝试过每一件我能想到的事情。但无法成功。

2 个答案:

答案 0 :(得分:0)

我同意在这种情况下错误消息不是非常有用。问题是当编译器看到

template<typename T>
void Reverse( node<T> *front);

它还不知道node<T>是什么。在声明 Reverse之前,不会声明该类模板。您可以通过在Reverse的类模板声明之后移动两个函数模板声明(Displaynode<T>)来解决此问题。

或者,您可以通过在{2}函数模板前面加node来转发声明template <typename T> class node; - 但这里没有理由进行前向声明。

一旦ReverseDisplay声明知道node<T>是什么,这两个都很好,你就会遇到下一个错误:

node<T> *temp = front;
stack<T> s;
s.push(temp);

sstack<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 ++代码按顺序编译,从文件的开头到结尾。必须在使用模板类和函数之前定义它们。

前向声明仅适用于普通的类和函数。虽然模板也可以向前声明,但它不会像您认为的那样工作。因此,在您更熟悉模板及其工作方式之前,您应该避免向前声明任何模板。