试图理解模板

jli*_*902 8 c++ templates

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

#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>调用版本?
什么会导致它被调用?
为什么语法的目的是什么?

Dan*_*rey 7

第二个重载需要一个整数,而不是一个类型.你打电话给它

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)

这与您编写的最后一个专业化完全相同,因此会与之冲突(重新定义它).实例