C ++ неопределенный конструктор - PullRequest
1 голос
/ 26 декабря 2011

Я только начинаю с C ++ и столкнулся с этой проблемой.У меня есть класс Fifo, определенный в Fifo.h:

/* 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 ]

2 голосов
/ 26 декабря 2011

2 балла:

  • Конструктор объявлен ошибочно.

    Fifo<T>(int len); //wrong
    Fifo(int len);    //right
    
  • Шаблоны должны быть определены в той же единице перевода, в которойони используются, поэтому наличие отдельных файлов .h и .cpp обычно не работает для шаблонов (см., например, этот вопрос ).Пожалуйста, переместите содержимое вашего файла cpp в файл заголовка, и все будет в порядке.

2 голосов
/ 26 декабря 2011

Если вы поместите определение шаблона в файл cpp, определения не будут доступны за пределами этого файла cpp. Когда вы включаете Fifo.h из Fifotest.cpp, компилятор видит объявление вашего шаблона, но не видит реализацию методов. Как только вы поместите их в заголовок Fifo.h, все должно скомпилироваться.

0 голосов
/ 26 декабря 2011

Вы должны предоставить определения в заголовочном файле. Ключевое слово export существует в стандарте, но обычные компиляторы его не реализовали.

...