2011-08-04 3 views
2

연산자를 템플릿 클래스에 오버로드하려고합니다. 그러나 뭔가 잘못된 것이 있습니다.템플릿 클래스의 오버로드 new 연산자

파일 test4.h, 나는 new 연산자를 구현하는 클래스

#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" 

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

#include "test4.h" 

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

MAIN.CPP 나는 파일을 .O하는 CPP 파일을 컴파일합니다. 모든 것은 괜찮습니다. 하지만 그들이 실행 파일에 링크 할 때 오류가 발생합니다

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 

하지만이 발생 템플릿 왜 라니를 사용하지 않는 경우 모든 것이 OK인가? 누군가가 나를 도울 수 있기를 바랍니다.

답변

3

템플릿 구현을 헤더 파일에도 넣어야합니다. 구현은 템플릿을 인스턴스화해야 할 때 컴파일러에서 볼 수 있어야합니다.

이유가 필요한 이유와이를 해결하는 방법에 대한 다음 항목을 확인하려면 C++FAQ 35.12을 입력하십시오.

(또한, operator new의 구현 뭔가를 반환해야합니다, 그렇지 않으면 컴파일하지 않아야합니다.)

+0

답장을 보내 주셔서 감사합니다.하지만 컴파일러가 보이지 않는 이유를 알고 싶습니다. 원리, 무언가 * 대답 * 또는 핵심어 *에 대해 뭔가 말해줘. 오신 것을 환영합니다. – Witcher42

+0

설명이있는 링크가 추가되었습니다. 키워드 : "컴파일 단위"및 C++/템플릿을 통해 더 많은 정보를 얻을 수 있습니다. – Mat

+0

대단히 고맙습니다. 추가 한 링크로 인해 제 문제가 해결 될 수 있습니다. – Witcher42

2
는 헤더 파일에 연산자의 구현을 이동

하고 컴파일해야한다.

0

new 연산자의 구현은 .cpp 파일이 아니라 헤더 파일에 있어야합니다.