【问题标题】:am i implementing this template class correctly?我是否正确实现了这个模板类?
【发布时间】:2010-01-29 18:53:20
【问题描述】:

好的,我正在尝试实现一个名为 Queue 的基于数组的队列的模板类。 这就是我的做法。首先,这是实现模板类的正确方法吗? 问题是,当我尝试编译时,我收到错误消息

未定义的引用 '队列::队列()'
未定义的引用 '队列::~队列()'

任何想法有什么问题吗?我是声明错了还是执行错了?

queue.h

#ifndef __QUEUE_H__
#define __QUEUE_H__

template <class T>
class Queue
{
    int first;
    T* array;

  public:
    Queue();
    ~Queue;
    void enqueue(T next);
    T dequeue();
    bool is_empty();
    bool is_full();

};

#endif

queue.cpp

#include "queue.h"

template <class T> Queue<T>::Queue(){
    ...
}
template <class T> Queue<T>::~Queue(){
    ...
}
template <class T> void Queue<T>::enqueue(T next){
    ...
}
template <class T> T Queue<T>::dequeue(){
    ...
}
template <class T> bool Queue<T>::is_empty(){
    ...
}
template <class T> bool Queue<T>::is_full(){
    ...
}

main.cpp

#include "queue.h"
#include <iostream>

using namespace std;

int main(){
  Queue<int> test;
  return 0;
}

【问题讨论】:

    标签: c++ class templates


    【解决方案1】:

    几个问题:

    • 问题的原因 - C++ 并不真正支持将模板拆分为 .h 和 .cpp 文件 - 您需要将所有内容放在标题中

    • 名称 __QUEUE_H__ 保留用于 C++ 实现,所有包含双下划线或以下划线和大写字母开头的名称也是如此。您不得在自己的代码中创建此类名称。

    • 您可能会发现使用 std::deque 而非 C 样式数组来实现队列更方便

    • 我假设您这样做是为了学习,但如果不是,您应该知道 C++ 标准库已经包含一个 std::queue 模板类。

    【讨论】:

    • @Neil,以双下划线开头的名称的保留仅适用于全局范围,不是吗?
    • +1: for the __ -- 有趣的是,这似乎是 C++ 标准中最广泛违反的规则。
    • @luke 否 - 适用于以下划线和 小写 字母开头的名称。我描述的名字在任何情况下都是保留的。
    • 啊,我不知道有什么区别。谢谢尼尔/詹姆斯。
    【解决方案2】:

    对于几乎所有 C++ 实现,模板实际上只是编译器知道的一种奇特的宏形式。必须存在定义,以便编译器可以生成代码来代替模板。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多