C ++未定义的构造函数

时间:2011-12-26 12:56:46

标签: c++ constructor undefined

我刚刚开始使用C ++,并遇到了这个问题。我在Fifo.h中定义了一个Fifo类:

/* Fifo.h */
#ifndef FIFO_H_
#define FIFO_H_

#include <atomic>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

template <class T>
class Fifo
{
public:

   Fifo<T>(int len);
   ~Fifo<T>();

   int  AddTokens(T* buffer, int len);
   int  RetrieveTokens(T* buffer, int len);

private:
   //int len;

};

#endif /* FIFO_H_ */

Fifo.cpp中的定义:

/* Fifo.cpp*/
#include "Fifo.h"

template <class T>
Fifo<T>::Fifo(int len)
{
  //_fifoptr = new FifoImpl_class((T)len);
  printf ("From the constructor\n");
  //thisbuffer = malloc(sizeof(T)*len);
}


template <class T>
Fifo<T>::~Fifo() { }

template <class T>
int Fifo<T>::AddTokens(T* buffer, int len)
{
  printf("Added tokens\n");
  return(1);
}


template <class T>
int Fifo<T>::RetrieveTokens(T* buffer, int len)
{
  printf("Removed tokens\n");
  return(2);
}

而且,我像这样测试我的课程(Fifotest.cpp):

#include "Fifo.h"
int main(int argc, char *argv[])
{
  Fifo<int> MyFifo(20);
}

使用gcc-4.5构建它会给我这个错误: 未定义的引用Fifo<int>::~Fifo()' undefined reference to Fifo :: Fifo(int)'

看起来我已经定义了相关的方法,但是我无法弄清楚为什么会出现这个错误。我花了时间谷歌搜索它,选项是采取正在运行的类并修改它。但是,我想知道我已经拥有的东西有什么问题。非常感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

If you put template definition in cpp file, the definitions will not be available outside that cpp file. 当您从Fifo.h中包含Fifotest.cpp时,编译器会看到模板类的声明,但它看不到方法的实现。将它们移动到Fifo.h标题后,一切都应该编译。

答案 1 :(得分:2)

2分:

  • 错误地声明了构造函数。

    Fifo<T>(int len); //wrong
    Fifo(int len);    //right
    
  • 模板应该在使用它们的同一个翻译单元中定义,因此单独的.h和.cpp文件通常不适用于模板(例如,参见this question)。请将cpp文件的内容移动到头文件中,你应该没问题。

答案 2 :(得分:0)

您应该在头文件中提供定义。标准中存在export关键字,但通常的编译器尚未实现。