Visual C++ 2012:编译器抱怨"missing ';'"

Visual C++ 2012: compiler complains about "missing ';'"

本文关键字:missing C++ 2012 编译器 Visual      更新时间:2023-10-16

你能告诉我以下模板类有什么问题吗?

#include <vector>
template <typename T, typename C>
struct pQueue{
    pQueue():currEnd(c.end()){};
    ~pQueue(){c.~vector();}
    void insert(T& t);
    void remove(T& t);
    bool find(T& t);
    T head(void);
private:
    std::vector<T> c;
    std::vector<T>::iterator currEnd;
};

编译器对std::vector<T>::iterator currEnd;行不太满意,并生成以下错误消息:

错误C2146:语法错误:缺少";"在标识符"currEnd"之前

错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认的int

非常感谢!

编译器不将std::vector<T>::iterator识别为类型。你必须告诉它:

typename std::vector<T>::iterator currEnd;

CCD_ 3被用作模板化上下文中的歧义消除器。它只是告诉编译器标识符std::vector<T>::iterator是一个类型,而不是静态成员。标准在模板化上下文中要求这样做,尽管在大多数情况下,编译器甚至可以在指定模板参数T之前就解决这个问题。


虽然上面的内容回答了您的问题,但我只能强调juancapanza对您的代码所指出的内容。此外,std::queue已经为您准备好了。

您需要告诉编译器迭代器是一个类型名称,因为它是一个依赖名称:

typename std::vector<T>::iterator currEnd;

除此之外,这个类不需要用户提供的析构函数。您的类定义可以简化为:

template <typename T>
struct pQueue
{
    pQueue() : currEnd(c.end()) {};
    void insert(const T& t);
    void remove(const T& t);
    bool find(const T& t);   // this should probably be a const method
    T head();                // this should probably be a const method
private:
    std::vector<T> c;
    typename std::vector<T>::iterator currEnd;
};

只是对其他答案的补充:

遗憾的是,VisualStudio没有很好的错误消息。你必须学会它们的意思,而不是逐字逐句地读。例如:

missing ';' before identifier 'currEnd'

是VisualStudio ese通常意味着"我不知道currEnd之前的标识符是什么。"通常这是由于当时它未定义。10次中有9次,它将是您忽略了#include标头的类型/类的类型/类名。在这种情况下,看起来更多的是编译器与模板中使用的模板混淆的问题。

然而,这一原则仍然有效。如果你从"编译器不知道currEnd之前的类型/类是什么"开始,你就会走上正轨。

我认为应该是typename std::vector<T>::iterator currEnd;

然后compilcatecompilator编译器可以发现iterator实际上是一个类型,而不是(std::vector的)成员。