読者です 読者をやめる 読者になる 読者になる

gl5_progのメモ

自分のためのメモとかまとめとか

テンプレートコンストラクタの落とし穴

http://ideone.com/qyfPdT

#include <stdio.h>

template<class T>
class Wrap
{
public:
    Wrap(){printf("Wrap()\n");}
    ~Wrap(){printf("~Wrap()\n");}
    template<class U>
    Wrap(const Wrap<U>&){ printf("Wrap(Wrap<U>)\n"); }
};

int main( void )
{
    Wrap<int> wrapInt;
    printf( "--------------\n" );
    Wrap<int> wrapInt2( wrapInt );
    printf( "--------------\n" );
    return 0;
}
Wrap()
--------------
--------------
~Wrap()
~Wrap()

問題は17行目の変数の初期化のところです。

 Wrap<int> wrapInt2( wrapInt );

出力結果を見ると、何も出力されていません。
つまり、このコンストラクタは呼ばれていません。

template<class U> Wrap(const Wrap<U>&){ printf("Wrap(Wrap<U>)\n"); }

おそらく、デフォルトのコピーコンストラクタが呼ばれているのでしょう。非テンプレート関数優先の法則みたいなのがあったような気がするので、上記テンプレートコンストラクタよりデフォルトのコピーコンストラクタにマッチしたという感じでしょうか(適当)。

テンプレートコンストラクタを用意するときは、デフォルトのコピーコンストラクタに注意しましょう。