【问题标题】:error: expected constructor, destructor, or type conversion before ‘<’ token错误:“<”标记之前的预期构造函数、析构函数或类型转换
【发布时间】:2011-06-25 08:42:12
【问题描述】:

我对 C++ 还很陌生,但已经获得了一些 java 经验。

在以下简短的 c++ 练习中,我尝试使用类模板构建堆栈。 不幸的是它无法编译,我不知道为什么。

错误信息是:

Stack.cpp:6: 错误:‘&lt;’ 令牌之前的预期构造函数、析构函数或类型转换
Stack.cpp:14:错误:‘&lt;’ 令牌之前的预期初始化程序
Stack.cpp:25:错误:‘&lt;’ 令牌之前的预期初始化程序
make[2]: * [build/Debug/GNU-Linux-x86/Stack.o] 错误 1

这是 Stack.h:

template <class T>
class Stack {
public:
    Stack(int = 10);

    ~Stack() {
        delete [] stackPtr;
    }

    int isEmpty()const {
        return top == -1;
    }

    int isFull() const {
        return top == size - 1;
    }

    int push(const T&);
    int pop(T&);

private:
    int size; // length i.e. number of elements on Stack.
    int top; //index of top element
    T* stackPtr;
};

堆栈.cpp:

template <class T>
Stack<T>::Stack(int s) {
    size = s > 0 && s < 1000 ? s : 15;
    top = -1; // initialize stack
    stackPtr = new T[size];
}

template <class T>
int Stack<T>::push(const T& item) {
    if (!isFull()) {
        stackPtr[++top] = item;
        return 1; // push successful
    }
    return 0; // push unsuccessful
}

template <class T>
int Stack<T>::pop(T& popValue) {
    if (!isEmpty()) {
        popValue = stackPtr[top--];
        return 1; // pop successful
    }
    return 0; // pop unsuccessful
}

main.cpp 看起来是这样的:

#include <iostream>
#include "Stack.h"
using namespace std;

int main(int argc, char** argv) {
    Stack<int> intStack;
    int i = 1.1;
    cout << "Pushing:" << endl;
    while (intStack.push(i)) {
        cout << i << ' ';
        i += 1;
    }
    cout << endl << "Stack Full" << endl
         << endl << "Popping elements from is" << endl;
    while (intStack.pop(i))
        cout << i << ' ';
    cout << endl << "Stack Empty" << endl;
}

这里出了什么问题?

【问题讨论】:

  • int = 10,我可以告诉你这是个问题。在stack.h中
  • 请参阅thisthis 问题,了解为什么.cpp 文件中不能有模板。
  • 我还建议阅读有关构造函数和更具体的初始化列表的内容!它们的使用非常重要,例如参见C++ FAQ Lite。此外,当一个方法只返回两个值(成功/失败)时,返回布尔值而不是整数值会更惯用且不易混淆。
  • @Laika:您立即编译错误的答案是您需要在Stack.cpp 的顶部使用#include "Stack.h",但问题仍然是members 的定义Stack 模板的一部分需要在 main 中实例化 Stack&lt;int&gt; 的位置可见。
  • @Laika:是的,请参阅我提供的链接以获得解释。只要您计划在多个翻译单元中使用该模板,它们就必须是仅标题。

标签: c++ templates


【解决方案1】:

我在 Visual Studio 2010 中按原样复制粘贴了您的代码,并且编译和链接没有任何问题,只要标题和 cpp 中的内容都在一个位置(即都粘贴在 main.cpp 中)。同样,GCC doesn't complain either

在将其拆分为标头和 cpp 后,它仍然编译得很好,但现在出现了链接器错误,我在评论中给出的链接中解释了它们的原因(thisthisthis C++ FAQ links might also be interesting)。从语法上讲,就我和我的编译器而言,您的代码没有任何问题。

我唯一能想到的是,看到您首先链接到粘贴完整文件的 pastebin(我当时在问题中编辑),是您从未在 Stack.cpp 中包含 Stack.h(我认为这可能是原因,因为您的Stack.h 粘贴甚至包含包含防护)。尽管如此,根本问题仍然存在。

【讨论】:

  • 你说得对,我之前的帖子中缺少包含语句。但是,它存在于我的 cpp 文件中!
  • @Laika:很有趣。如果您只是在类定义之后将 cpp 内容复制粘贴到标题中会发生什么?
  • 头文件应该是什么样的?
  • @Laika:排除包含守卫,例如this
  • 当我把头文件改成这个时,有一些符号找不到: Stack.h: In member function 'int Stack::push(const T&)': In file包含在 main.cpp:3: Stack.h:28: 错误: 'item' 没有在这个范围内声明 Stack.h: 在成员函数'int Stack::pop(T&)': Stack.h: 36: 错误: 'popValue' 未在此范围内声明 make[2]: *** [build/Debug/GNU-Linux-x86/main.o] 错误 1
猜你喜欢
  • 2018-12-04
  • 2016-03-14
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多