2011-08-04 35 views
2

我想在模板類中重載新的操作符。但有些事情發生錯誤。關於模板類中的新操作符過載錯誤

在文件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 

但一切就OK了,如果我不使用模板。爲什麼出現這種情況? 所以,我希望有人能幫助我。

回答

3

您還需要將模板實現放在頭文件中。當需要實例化模板時,編譯器需要對編譯器可見。

這個C++FAQ 35.12要了解爲什麼這是必要的,以及以下條目的解決方法。

(另外,你的operator new實現應返回的東西,它不應該,否則編譯。)

+0

感謝您的回答,但我想知道它爲什麼對編譯器不可見。告訴我有關該原則的一些情況,歡迎任何*答案*或*關鍵字*。 – Witcher42

+0

添加了解釋的鏈接。關鍵詞:「編譯單元」和C++ /模板應該讓你找到更多。 – Mat

+0

非常感謝您添加的鏈接可以解決我的問題。 – Witcher42

2

移動運營商實施的頭文件,它應該編譯。

0

您的new運算符的實現也需要位於頭文件中,而不是.cpp文件。