0

您能否向我指出以下模板类有什么问题?

#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++ 不支持默认整数

非常感谢你!

4

4 回答 4

3

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

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

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


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

于 2013-08-27T13:02:57.640 回答
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;
};
于 2013-08-27T13:03:05.233 回答
0

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

然后compilcater 编译器编译器可以找出它iterator实际上是一个类型而不是一个成员 (of std::vector)。

于 2013-08-27T13:03:21.577 回答
0

只是作为其他答案的附录:

可悲的是,VisualStudio 没有很好的错误消息。您几乎必须了解它们的含义,而不是从字面上阅读它们。例如:

missing ';' before identifier 'currEnd'

Is VisualStudio-ese 通常表示“我不知道之前的标识符currEnd是什么”。通常这是因为它在那个时候是未定义的。10 次中有 9 次,它将是您忽略的类型/类的类型/类名称#include。在这种情况下,看起来更像是编译器与模板中的模板使用混淆了。

但是,原则是成立的。如果您从“编译器不知道之前的类型/类currEnd是什么”开始,那么您将走在正确的轨道上。

于 2013-08-27T13:29:12.083 回答