请您指出以下模板类有什么问题?
#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
非常感谢!
答案 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
之前的类型/类是什么。”,您将走在正确的轨道上。