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)