ошибки о перегрузке нового оператора в шаблонном классе - PullRequest
2 голосов
/ 04 августа 2011

Я хочу перегрузить новый оператор в шаблонном классе. Но что-то не так происходит.

В файле test4.h я определил класс

#include <stddef.h>
#include <iostream>

template <class T>
class lei{
 public:
  T me;                                    
  static void* operator new(size_t size);
};

test4.cpp реализовать новый оператор.

#include "test4.h"

template <class T>
void* lei<T>::operator new(size_t size){
  std::cout << size << std::endl;
}    

main.cpp

#include "test4.h"

int main(){
  lei<size_t> *pl;
  pl = new lei<size_t>;
}

Я компилирую файлы cpp в файл .o. Все отлично. Но когда я связываю их с исполняемым файлом, возникает ошибка:

main.o: In function `main':
main.c:(.text+0x19): undefined reference to `lei<unsigned int>::operator new(unsigned int)'
collect2: ld returned 1 exit status

но все в порядке, если я не использую шаблон . Почему это происходит? Итак, я надеюсь, что кто-то может мне помочь.

Ответы [ 3 ]

3 голосов
/ 04 августа 2011

Вам также необходимо поместить реализацию шаблона в заголовочный файл.Реализация должна быть видимой для компилятора, когда ему нужно создать экземпляр шаблона.

Этот C ++ FAQ 35.12 , чтобы узнать, почему это необходимо, и следующие записи для способовисправить это.

(Кроме того, ваша реализация operator new должна что-то возвращать, иначе не должна компилироваться.)

2 голосов
/ 04 августа 2011

Переместите реализацию оператора в заголовочный файл, и он должен скомпилироваться.

0 голосов
/ 04 августа 2011

Реализация вашего оператора new также должна быть в заголовочном файле, а не в файле .cpp.

...