gpt4 book ai didi

c++ - 试图理解模板

转载 作者:可可西里 更新时间:2023-11-01 17:38:06 25 4
gpt4 key购买 nike

我写了一个简短的例子来说明我在这里遇到的困惑:

#include <iostream>

template <typename T>
T Add (T t1, T t2)
{
std::cout << "<typename T>" << std::endl ;
return t1 + t2 ;
}

template <int>
int Add (int n1, int n2)
{
std::cout << "<int>" << std::endl ;
return n1 + n2 ;
}

template <>
int Add (int n1, int n2)
{
std::cout << "<>" << std::endl ;
return n1 + n2 ;
}

int main (void)
{
Add (5, 4) ;
Add <int> (5, 4) ;
Add <> (5, 4) ;

return 0 ;
}

这个的输出是:

<>  
<>
<>

所以我在想,好吧,最明确的特化优先。
但后来我删除了:

template <>
int Add (int n1, int n2)
{
std::cout << "<>" << std::endl ;
return n1 + n2 ;
}

输出是:

<typename T>  
<typename T>
<typename T>

为什么不 template <int>版本被调用?
什么会导致它被调用?
为什么该语法的目的是?

最佳答案

第二个重载需要一个整数,而不是一个类型。你会用

来调用它
Add< 42 >( 1, 2 );

Live example

澄清一下:第二个是一个名为 Add 的独立重载函数,而不是特化。你可能在想这样的事情:

template <>
int Add<int>(int n1, int n2)
{
std::cout << "<T=int>" << std::endl ;
return n1 + n2 ;
}

这与您编写的最后一个特化完全相同,因此会与之冲突(重新定义)。 Live example

关于c++ - 试图理解模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21267732/

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