Visual C ++ 2012:编译器抱怨“缺少';'”

时间:2013-08-27 13:00:22

标签: c++ visual-c++

请您指出以下模板类有什么问题?

#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 ++不支持default-int

非常感谢!

4 个答案:

答案 0 :(得分:3)

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

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

typename在模板化语境中用作消歧者。它只是告诉编译器标识符std::vector<T>::iterator是一个类型而不是静态成员。该标准在模板化上下文中需要这个,即使在大多数情况下,编译器甚至可以在指定模板参数T之前就能解决这个问题。


虽然上面回答了你的问题,但我只能强调juanchopanza指出你的代码。此外,您已经std::queue了。

答案 1 :(得分:1)

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

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;
};

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

仅作为其他答案的附录:

可悲的是,VisualStudio没有非常好的错误消息。你几乎要学习它们的意思,而不是从字面上理解它们。例如:

missing ';' before identifier 'currEnd'

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

然而,原则就是这样。如果您开始使用,“编译器不知道currEnd之前的类型/类是什么。”,您将走在正确的轨道上。