gpt4 book ai didi

c++ - 模板特化

转载 作者:可可西里 更新时间:2023-11-01 16:36:38 27 4
gpt4 key购买 nike

我有以下一组模板:

//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 而 funcT( &x1 ); 调用函数 #2 而不是预期的函数 #4?
我已经读过这篇文章http://www.gotw.ca/publications/mill17.htm其中说“重载解析忽略了特化并仅在基本功能模板上运行”。但是根据这个逻辑 funcT( x1 ); 应该调用函数#1,而不是#3。我很困惑。

最佳答案

函数#3 和#4 分别是#1 的特化,而不是#1 和#2 的特化。

这意味着您的编译器将首先在#1 和#2 之间进行选择。当它选择 #1 最适合 funcT(x1) 时,它会选择特化 #3。对于 funcT(&x1),它选择 #2 作为最合适的并且没有发现特化。

将#4 写成

template<> void funcT<>( int * arg )

它成为 #2 的特化,您将获得为 funcT(&x1) 调用 #4 的预期结果。

另一种选择是简单地写

void funcT(int *arg)

因为如果匹配,将始终选择常规函数而不是模板版本。

关于c++ - 模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2195774/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com