error C2783: 无法为“T”推导 模板 参数

原则:“模板参数推导机制无法推导函数的返回值类型”

版本一:

// 缺少<T>     参数 int n    对比第三个版本( 缺少<T>   参数 T n) !

编译错误提示:

错误 1 error C2783: “T FibRecursion(int)”: 无法为“T”推导 模板 参数 c:\users\yi\documents\visual studio 2005\projects\斐波纳契数列\斐波纳契数列\斐波纳契数列.cpp 16

 1 #include "stdafx.h"
 2 #include <iostream>
 3
 4 template<class T>
 5 T FibRecursion(int n)                             // 参数 int n
 6 {
 7     if (n<0)
 8         return -1;
 9
10     if (n == 0 || n == 1)
11         return 1;
12
13     return FibRecursion(n-1) + FibRecursion(n-2); // 缺少<T>
14 }
15 int _tmain(int argc, _TCHAR* argv[])
16 {
17     int result = FibRecursion<int>(30);           //错误行
18     system("pause");
19     return 0;
20 }

版本二:

// 加上<T>   参数 int n 或者 T n

编译通过!

 1 #include "stdafx.h"
 2 #include <iostream>
 3
 4 template<class T>
 5 T FibRecursion(int n)                                   // 参数 int n
 6 {
 7     if (n<0)
 8         return -1;
 9
10     if (n == 0 || n == 1)
11         return 1;
12
13     return FibRecursion<T>(n-1) + FibRecursion<T>(n-2); // 加上<T>
14 }
15 int _tmain(int argc, _TCHAR* argv[])
16 {
17     int result = FibRecursion<int>(30);                 //没有报错
18     system("pause");
19     return 0;
20 }
 1 #include "stdafx.h"
 2 #include <iostream>
 3
 4 template<class T>
 5 T FibRecursion(T n)                                     // 参数 T n
 6 {
 7     if (n<0)
 8         return -1;
 9
10     if (n == 0 || n == 1)
11         return 1;
12
13     return FibRecursion<T>(n-1) + FibRecursion<T>(n-2); // 加上<T>
14 }
15 int _tmain(int argc, _TCHAR* argv[])
16 {
17     int result = FibRecursion<int>(30);                 //没有报错
18     system("pause");
19     return 0;
20 }

版本三:

// 缺少<T>   参数 T n

编译通过!

 1 #include "stdafx.h"
 2 #include <iostream>
 3
 4 template<class T>
 5 T FibRecursion(T n)                                     // 参数 T n
 6 {
 7     if (n<0)
 8         return -1;
 9
10     if (n == 0 || n == 1)
11         return 1;
12
13     return FibRecursion(n-1) + FibRecursion(n-2);      // 缺少<T>
14 }
15 int _tmain(int argc, _TCHAR* argv[])
16 {
17     int result = FibRecursion<int>(30);                 //没有报错
18     system("pause");
19     return 0;
20 }

http://bbs.sjtu.edu.cn/bbstcon,board,C,reid,1293357257.html 没看懂,囧!

时间: 2024-10-08 11:13:01

error C2783: 无法为“T”推导 模板 参数的相关文章

模板参数推导

模板参数推导(template argument deduction),是在调用C++的模板函数时,由编译器根据使用上下文来推断所调用的模板函数的模板参数.这一概念也适用于类的模板成员函数. 类模板也存在模板参数推导的情形.例如: template <class T> struct eval; template <template <class, class...> class TT, class T1, class... Rest> struct eval<TT

C++11 函数模板的默认模板参数

类模板:通用的类描述(使用泛型来定义类),进行实例化时,其中的泛型再用具体的类型替换. 函数模板:通用的函数描述(使用泛型来定义函数),进行实例化时,其中的泛型再用具体的类型替换. [1]C++98标准中两者的区别 函数模板和类模板在C++98标准中一起被引入,两者区别主要在于: 在类模板声明时,标准允许其有默认模板参数.而函数模板却不支持. 默认模板参数的作用如同函数的默认形参.不过在C++11中,这一限制已经被解除了,如下例所示: 1 void DefParm(int m = 3) {} /

C++11 图说VS2013下的引用叠加规则和模板参数类型推导规则

背景:    最近在学习C++STL,出于偶然,在C++Reference上看到了vector下的emplace_back函数,不想由此引发了一系列的“探索”,于是就有了现在这篇博文. 前言:      右值引用无疑是C++11新特性中一颗耀眼的明珠,在此基础上实现了移动语义和完美转发,三者构成了令很多C++开发者拍案叫绝的“铁三角”(当然不是所有C++开发者).而在这个“铁三角”中,有一个无法回避的关键细节,那就是引用叠加规则和模板参数类型推导规则.其实,关于这两个规则,可查到的资料不少,但都

C++ Primer 学习笔记_45_模板(三):缺省模板参数(借助标准模板容器deque实现Stack模板)、成员模板、关键字typename

一.缺省模板参数 1.stack内存能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: template <typename T, typename CONT = std::deque<T> > //此处末尾必须有空格,否则编译出错 class Stack { - private: CONT c_; }; 如果没有传第二个参数,默认为deque 双端队列,当然我们也可以传递std::vector<T> 2.示例:借助

零值初始化&amp;字符串常数作为函数模板参数

1.在定义一个局部变量时,并希望该局部变量的初始化一个值,可以显示调用其默认构造函数,使其值为0(bool类型默认值为false). template <typename T> void foo() { T x = T(); } 类模板其成员有可能被参数化.为了确保初始化这样的成员,必须定义一个构造函数,在成员初始化列表中对每个成员进行初始化: template <typename T> class MyClass { private: T x; public: MyClass:X

c++ 模板参数做容器参数,迭代器报错 vector&lt;T&gt;::const_iterator

错误如下: template<class T>void temp(std::vector<T>& container){        std::vector<T>::const_iterator p; //error: expected ‘;’ before ‘p’        for(p = container.begin(); p != container.end(); ++p)        {                //...       

C++非类型模板参数

对于函数模板与类模板,模板参数并不局限于类型,普通值也可以作为模板参数.在基于类型参数的模板中,你定义了一些具体的细节来加以确定代码,直到代码被调用时这些细节才被真正的确定.但是在这里,我们面对的是这些细节是值,而不是类型,当要使用基于值的模板时,必须显式地指定这些值,才能够对模板进行实例化. 本文地址:http://www.cnblogs.com/archimedes/p/cpp-template-type.html,转载请注明源地址. 在上篇文章(C++类模板)中我们介绍了一个stack类模

非类型模板参数

对于函数模板与类模板,模板参数并不局限于类型,普通值也可以作为模板参数.在基于类型参数的模板中,你定义了一些具体的细节来加以确定代码,直到代码被调用时这些细节才被真正的确定.但是在这里,我们面对的是这些细节是值,而不是类型,当要使用基于值的模板时,必须显式地指定这些值,才能够对模板进行实例化. 非类型的类模板参数 创建类的头文件 #include<stdexcept> #include<iostream> using namespace std; template<typen

读书笔记 effective c++ Item 44 将与模板参数无关的代码抽离出来

1. 使用模板可能导致代码膨胀 使用模板是节省时间和避免代码重用的很好的方法.你不需要手动输入20个相同的类名,每个类有15个成员函数,相反,你只需要输入一个类模板,然后让编译器来为你实例化20个特定的类和300个你需要的函数.(只有在被使用的情况下类模版的成员函数才会被隐式的实例化,所以只有在300个函数被实际用到的情况下才会生成300个成员函数.)函数模板同样吸引人.你不用手动实现许多函数,你只需要实现一个函数模板,然后让编译器来做余下的事情. 然而在有些时候,如果你不小心,使用模板会导致代