我想在模板类中重载 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
但是如果我不使用模板,一切都会好的。为什么会发生这种情况? 所以,我希望有人可以帮助我。
答案 0 :(得分:3)
您还需要将模板实现放在头文件中。当需要实例化模板时,编译器需要可以看到实现。
这是C++FAQ 35.12以了解为什么这是必要的,以及以下条目来解决它。
(另外,你的operator new
的实现应该返回一些内容,否则不应该编译。)
答案 1 :(得分:2)
将运算符的实现移动到头文件,它应该编译。
答案 2 :(得分:0)
您的new
运算符的实现也需要在头文件中,而不是.cpp文件。