次のテンプレートのセットがあります。
//1
template< typename T > void funcT( T arg )
{
std::cout<<"1: template< typename T > void funcT( T arg )";
}
//2
template< typename T > void funcT( T * arg )
{
std::cout<<"2: template< typename T > void funcT( T * arg )";
}
//3
template<> void funcT< int >( int arg )
{
std::cout<<"3: template<> void funcT< int >( int arg )";
}
//4
template<> void funcT< int * >( int * arg )
{
std::cout<<"4: template<> void funcT< int *>( int * arg )";
}
//...
int x1 = 10;
funcT( x1 );
funcT( &x1 );
funcT( x1 );
関数 #3 を呼び出し、関数 #2 を呼び出すが、期待どおり #4 を呼び出さない理由を誰か説明してもらえますかfuncT( &x1 );
?
私はすでにこの記事http://www.gotw.ca/publications/mill17.htmを読みました。これには、「オーバーロードの解決は特殊化を無視し、基本関数テンプレートのみで動作する」と書かれています。しかし、このロジックによればfuncT( x1 );
、#3 ではなく関数 #1 を呼び出す必要があります。私は混乱しています。