有关在模板类中重载new运算符的错误

时间:2011-08-04 08:30:03

标签: c++ operator-overloading new-operator

我想在模板类中重载 new 运算符。但是发生了一些错误的事情。

在文件 test4.h 中,我定义了一个类

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

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

test4.cpp 实现new运算符。

#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 个答案:

答案 0 :(得分:3)

您还需要将模板实现放在头文件中。当需要实例化模板时,编译器需要可以看到实现。

这是C++FAQ 35.12以了解为什么这是必要的,以及以下条目来解决它。

(另外,你的operator new的实现应该返回一些内容,否则不应该编译。)

答案 1 :(得分:2)

将运算符的实现移动到头文件,它应该编译。

答案 2 :(得分:0)

您的new运算符的实现也需要在头文件中,而不是.cpp文件。