2011-08-04 8 views
2

新しいテンプレートテンプレートクラスの演算子をオーバーロードしたいですか?しかし、何か間違ったことが起こる。テンプレートクラスのオーバーロードに関する新しい演算子

はファイル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" 

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>; 
} 

私は、ファイルをの.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 

が、私はたまたまテンプレート .Whyを使用しない場合はすべてが、OKですか? 誰かが私を助けてくれることを願っています。

答えて

3

ヘッダーファイルにもテンプレート実装を配置する必要があります。コンパイル時にテンプレートをインスタンス化する必要がある場合、実装を可視にする必要があります。

これはなぜこれが必要なのかを知るためのC++FAQ 35.12と、それを修正するための次のエントリです。

(また、operator newの実装が何かを返す必要があり、それがそうでなければ、コンパイルべきではありません。)

+0

あなたの答えをありがとうが、私はそれがコンパイラには見えない理由を知りたい。原則、何か*答え*、*キーワード*について何か教えてください。歓迎です。 – Witcher42

+0

説明付きのリンクが追加されました。キーワード: "コンパイル単位"とC++ /テンプレートにより、より多くの情報を見つけることができます。 – Mat

+0

ありがとうございました非常にあなたが追加したリンクは私の問題を解決することができます。 – Witcher42

2
ヘッダファイルにオペレータの実装を移動

、それはコンパイルする必要があります。

0

new演算子の実装は、.cppファイルではなくヘッダーファイル内にある必要があります。

関連する問題