【问题标题】:Referencing a struct declared in a template class引用在模板类中声明的结构
【发布时间】:2011-08-01 06:48:12
【问题描述】:

好的,现在在 C++ 学习了大约 2 天。之前刚做过javascript...

我正在使用链表制作模板队列。当我尝试从 insidek 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 `;'

有什么帮助吗?提前致谢。

【问题讨论】:

    标签: c++ class templates struct


    【解决方案1】:

    您使用的编译器是什么?您的代码应该没有任何问题。因为在类内部使用Queue这个名字时,就相当于Queue&lt;Object&gt;

    它是 C++ 标准,

    像普通(非模板)类一样, 类模板有一个 注入类名(第 9 条)。这 注入类名可以与 或没有模板参数列表。 当它没有使用时 模板参数列表,它是 相当于注入的类名 其次是模板参数 中包含的类模板。 当它与一个 模板参数列表,它指的是 指定的类模板 专业化,这可能是 当前专业或其他 专业化。

    【讨论】:

      【解决方案2】:

      一旦复制构造函数启动,&lt;Object&gt; 将在需要时与Queue 一起隐式添加。为了与所有平台兼容,您应该声明如下:

      front = back = new typename Queue::Node;  //this is line 26
      

      【讨论】:

        【解决方案3】:

        这里有一个稍微不同的建议:

        // Node is defined within same "class { }", so it needs no "::" qualification
        front = back = new Node;
        

        无论如何,您给定的代码编译得很好 (http://ideone.com/UrLN0),所以我想知道这里是否还有其他内容。

        没有模板参数的标识符Queue 指的是模板本身内部的当前实例化。

        【讨论】:

        • 在 C++0x 中,他需要 typename 之前的 Queue::Node 。您尝试的编译器可能实现了 C++0x 的含义,这意味着您可以不使用它。
        • @Johannes:如果没有使用::,就不需要typename,对吧?
        【解决方案4】:

        Queue的成员函数内部,可以直接引用Node

        front = back = new Node;                 //this is line 26
        

        Node * ptr = original.front->next;
        

        您在循环中的内容也将起作用,您可以在其中明确指定模板参数。不过要注意,由于Node是私有的,除非你把模板实例化friends相互之间,你必须为当前实例化指定模板参数,所以Queue&lt;Object&gt;::Node可以,但Queue&lt;int&gt;::Node不行,除了 Queue&lt;int&gt; 本身。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-31
          • 1970-01-01
          • 1970-01-01
          • 2012-11-13
          • 1970-01-01
          • 1970-01-01
          • 2011-03-18
          相关资源
          最近更新 更多