我写了一个简短的例子,说明我在这里遇到的困惑:
#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 ;
}
Run Code Online (Sandbox Code Playgroud)
这个输出是:
<>
<>
<>
Run Code Online (Sandbox Code Playgroud)
所以我在想,好吧,最明确的专业化获得优先权.
但后来我删除:
template <>
int Add (int n1, int n2)
{
std::cout << "<>" << std::endl ;
return n1 + n2 ;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
<typename T>
<typename T>
<typename T>
Run Code Online (Sandbox Code Playgroud)
为什么不template <int>调用版本?
什么会导致它被调用?
为什么语法的目的是什么?
第二个重载需要一个整数,而不是一个类型.你打电话给它
Add< 42 >( 1, 2 );
Run Code Online (Sandbox Code Playgroud)
澄清:第二个是一个独立的重载函数,称为Add非专业化.你可能会想到类似的东西:
template <>
int Add<int>(int n1, int n2)
{
std::cout << "<T=int>" << std::endl ;
return n1 + n2 ;
}
Run Code Online (Sandbox Code Playgroud)
这与您编写的最后一个专业化完全相同,因此会与之冲突(重新定义它).实例