Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 试图理解模板_C++_Templates - Fatal编程技术网

C++ 试图理解模板

C++ 试图理解模板,c++,templates,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 &

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

#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 ;
}
#包括
模板
T加(t1,t2)
{

std::cout第二个重载要求的是整数,而不是类型。您可以用

Add< 42 >( 1, 2 );

这与您上次编写的专门化完全相同,因此会与之冲突(重新定义)。

您对
int
s的专门化使用了错误的语法。应该是:

template <>
int Add<int>(int n1, int n2)
{
    std::cout << "<int>" << std::endl ;
    return n1 + n2 ;
}
模板
整数相加(整数n1,整数n2)
{

std::这是一个好问题。如果你想调用
int
一个,那么使用
template
而不是
template
+1作为关于歧义解决方案的注释。放弃我的答案并投票表决这个答案。这个答案缺少解决方案,它将是完美的(解决方案在另一个答案中,你知道)@user9000我不能这么快输入,我想为OP提供一些实例:)(当然更新了答案)这回答了
什么会导致调用它的问题?
为什么不调用模板版本?
,但是OP提出的另一个问题仍然没有得到回答。实际上,我很好奇,除了为模板对象提供编译时参数之外,这还有什么用这是一个实际的值……我现在觉得自己很愚蠢,因为我知道这一点。我的脑子里一片空白。@Smac89我想这是一个隐含的答案。OP认为这个“语法”会专门化第一个模板,但实际上它创建了一个重载函数。你可能会在实践中找到一个用于此的用例,但肯定不会在SSCE中找到:)
<typename T>  
<typename T>  
<typename T>  
Add< 42 >( 1, 2 );
template <>
int Add<int>(int n1, int n2)
{
    std::cout << "<T=int>" << std::endl ;
    return n1 + n2 ;
}
template <>
int Add<int>(int n1, int n2)
{
    std::cout << "<int>" << std::endl ;
    return n1 + n2 ;
}