C++ 模板专门化

C++ 模板专门化,c++,templates,specialization,C++,Templates,Specialization,我有以下一组模板: //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<

我有以下一组模板:

//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 );  
//1
模板void函数(T参数)
{
std::cout void funcT(T*arg)
{
标准::cout(int arg)
{  
标准::cout(int*arg)
{  
std::cout函数#3和#4分别是#1的专门化,而不是#1和#2的专门化

这意味着您的编译器将首先在#1和#2之间进行选择。当它选择#1作为funcT(x1)的最佳拟合时,它将选择专门化#3。对于funcT(&x1),它选择#2作为最佳拟合,并且未找到专门化

通过将#4写为


因为正则函数总是会被选择而不是模板版本,如果匹配的话,

这似乎是相关的:我可以给你发一本书,这真的很好:Addison Wesley -C++模板——完整的GueDeWror。你可以添加这个,使α4成为一个2的特殊化,得到“预期”。行为,它应该写为
template void funcT(int*arg)
@eric Malenfant:正确,我不确定你的评论或我的编辑是否首先出现,但无论如何还是要感谢。为什么它是
template void funcT(int*arg)
而不是
template void funcT(int*arg)
?@sepp2k:我想这也行。不过OP使用了,它告诉编译器T=int*,这意味着#2有参数T*=int**,所以它不匹配。
template<> void funcT<>( int * arg )
void funcT(int *arg)