好的,现在在C ++工作了大约2天。刚刚完成javascript ...
我正在使用链接列表创建模板队列。当我尝试从withink queue.cpp
创建一个新的Node结构时,我的编译器不喜欢它//queue.h:
template <class Object>
class Queue
{
public:
Queue(); // Default
Queue(const Queue& original); // Copy
~Queue(); // Destructor
const Queue& operator=(const Queue& rightHandSide); //overloaded op
bool isEmpty() const;
bool enqueue(const Object& d);
bool dequeue(Object& d);
private:
// Node definition
struct Node
{
Object data;
Node * next;
};
// Queue data members
Node * front, * back;
};
因此,在我的复制构造函数中,我需要创建一个新节点。
//queue.cpp
template <class Object>
Queue<Object>::Queue(const Queue& original)
{
if (original.isEmpty()) {
front = back = NULL;
} else {
front = back = new Queue::Node; //this is line 26
front->data = original.front->data;
Queue::Node * ptr = original.front->next;
while (ptr != NULL) {
back->next = new Queue<Object>::Node;
back = back->next;
back->data = ptr->data;
ptr = ptr->next;
}
}
}
queue.cpp: In copy constructor âQueue<Object>::Queue(const Queue<Object>&)â:
queue.cpp:26: error: expected type-specifier
queue.cpp:26: error: expected `;'
任何帮助PLZ?提前谢谢。
答案 0 :(得分:3)
Queue
的内部成员函数,您可以直接引用Node
。
front = back = new Node; //this is line 26
和
Node * ptr = original.front->next;
循环中的内容也可以使用,您可以在其中明确指定模板参数。但请注意,由于Node
是私有的,除非您相互进行模板实例化friend
,否则必须为当前实例化指定模板参数,因此Queue<Object>::Node
很好,但是除Queue<int>::Node
本身外,Queue<int>
不是。{/ p>
答案 1 :(得分:1)
您的编译器使用了什么?您的代码应该没有任何问题。因为在类中使用名称Queue时,相当于Queue<Object>
。
它采用C ++标准,
与普通(非模板)类一样, 类模板有一个 注入类名(第9条)。该 inject-class-name可以使用 或没有template-argument-list。 什么时候使用没有 template-argument-list,它是 相当于inject-class-name 其次是模板参数 括在&lt;&gt;中的类模板。 与它一起使用时 template-argument-list,它指的是 指定的类模板 专业化,可能是 目前的专业化或其他 专业化。
答案 2 :(得分:0)
复制构造函数启动后,只要需要,<Object>
将与Queue
一起隐式添加。为了与所有平台兼容,您应该声明如下:
front = back = new typename Queue::Node; //this is line 26
答案 3 :(得分:0)
这是一个略有不同的建议:
// Node is defined within same "class { }", so it needs no "::" qualification
front = back = new Node;
在任何情况下,你给出的代码编译得很好(http://ideone.com/UrLN0),所以我想知道在这里还有别的东西。
没有模板参数的标识符Queue
是指模板本身内的当前实例化。