为了账号安全,请及时绑定邮箱和手机立即绑定

当模板参数被用作另一个模板的参数时,为什么不能推导模板参数呢?

当模板参数被用作另一个模板的参数时,为什么不能推导模板参数呢?

C++
倚天杖 2019-07-03 16:34:45
当模板参数被用作另一个模板的参数时,为什么不能推导模板参数呢?这个代码有什么问题?#include <map>template<typename T>struct TMap{     typedef std::map<T, T> Type;};template<typename T>T test(typename TMap <T>::Type &tmap_)      { return 0.0; }int _tmain(int argc, _TCHAR* argv[]){     TMap<double>::Type tmap;     tmap[1.1] = 5.2;     double d = test(tmap); //Error: could not deduce template argument for T     return 0;}
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

这是不可还原的上下文。这就是为什么编译器不能推导模板参数的原因。

想象一下如果你有专门的TMap详情如下:

template <>struct TMap<SomeType>{
    typedef std::map <double, double> Type;};

编译器将如何推断类型SomeType,考虑到TMap<SomeType>::Typestd::map<double, double>?它不能。它是保证类型你用在std::map这个类型在……里面TMap..编译器不能做出这种危险的假设。之间可能没有任何关系。类型争论,不管是什么。

另外,您可能有另一个专门化的TMap定义为:

template <>struct TMap<OtherType>{
    typedef std::map <double, double> Type;};

这使情况更加恶化。现在你有了以下几点:

  • TMap<SomeType>::Type = std::map<double, double>.

  • TMap<OtherType>::Type = std::map<double, double>.

现在扪心自问:给予TMap<T>::Typestd::map<double, double>,编译器如何知道TSomeTypeOtherType?它甚至不知道多少它有这样的选择,也不知道选择他们自己.。

我只是为了思考实验而问你(假设它能知道一套完整的.选择).


查看完整回答
反对 回复 2019-07-03
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

编译器错误消息的确切内容是:TMap<T>::TypeT是不能按照标准演绎的。这样做的原因可能是技术上不可能实现:编译器必须实例化所有可能的TMap<T>以查看是否有一个(且只有一个)匹配您传递的类型。有一个无穷多的TMap<T>.


查看完整回答
反对 回复 2019-07-03
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

就连你也有:

TMap<SomeType>::Type = std::map<double, double>.

但在调用test(TMap)之前

TMap<double>::Type tmap;tmap[1.1] = 5.2;double d = test(tmap);

你已经把它声明为

TMap<double>::Type tmap;

为什么不能利用这些信息。#ty对联不只是简单的字符串替换。


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 556 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信