テンプレートでメンバ関数がコンパイルされるタイミング

前回のshared_ptrの実装4 - while( c++ );

template < typename T >
class shared_ptr
{
...略
reference operator*()const
{ return *ptr; }
};
int main()
{
    shared_ptr< void > p; //←このタイミングでoperator*もコンパイルされると思っていた。。。

    return 0;
}

違うんですね。。。
ということでいろいろ調べてみました。VC++2008EEを使いました。

#pragma message( "1" )
template < typename T >
class Hoge
{
private:
#pragma message( "2" )
	T t;
#pragma message( "3" )
public:
#pragma message( "4" )
	Hoge( T t )
#pragma message( "5" )
		: t( t )
#pragma message( "6" )
	{
#pragma message( "7" )
	}
#pragma message( "8" )
public:
#pragma message( "9" )
	void piyo()
	{
#pragma message( "10" )
	}
#pragma message( "11" )


#pragma message( "12" )
	void fuga( T t )
	{
#pragma message( "13" )
	}
#pragma message( "14" )
};
#pragma message( "15" )

int main()
{
#pragma message( "16" )
	Hoge< int > a( 100 );
#pragma message( "17" )
	a.piyo();
#pragma message( "18" )

	return 0;
}
#pragma message( "19" )

VCでは

#pragma message( 文字列 )

で、コンパイル時にアウトプットウィンドウに対して文字列を出力することができます。他のコンパイラは申し訳ありませんがわかりません。

上のプログラムをコンパイルすると、以下のように出力されます。

1>コンパイルしています...
1>main.cpp
1>1
1>2
1>3
1>4
1>5
1>6
1>7
1>8
1>9
1>10
1>11
1>12
1>13
1>14
1>15
1>16
1>2
1>3
1>4
1>5
1>8
1>9
1>11
1>12
1>14
1>17
1>18
1>19
1>6
1>7
1>10
1>リンクしています...
Hoge< int > a;//ここで関数はコンパイルされないんですね。

勘違いしてました。
ソース全体を一度コンパイルしてから、呼び出している関数のみコンパイルするようです。
これでreference operator*()の謎が解けました。