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

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

这个代码有什么问题?

#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;}


倚天杖
浏览 557回答 3
3回答

呼如林

这是不可还原的上下文。这就是为什么编译器不能推导模板参数的原因。想象一下如果你有专门的TMap详情如下:template&nbsp;<>struct&nbsp;TMap<SomeType>{ &nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;std::map&nbsp;<double,&nbsp;double>&nbsp;Type;};编译器将如何推断类型SomeType,考虑到TMap<SomeType>::Type是std::map<double, double>?它不能。它是不保证类型你用在std::map是也这个类型在……里面TMap..编译器不能做出这种危险的假设。之间可能没有任何关系。类型争论,不管是什么。另外,您可能有另一个专门化的TMap定义为:template&nbsp;<>struct&nbsp;TMap<OtherType>{ &nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;std::map&nbsp;<double,&nbsp;double>&nbsp;Type;};这使情况更加恶化。现在你有了以下几点:TMap<SomeType>::Type&nbsp;=&nbsp;std::map<double, double>.TMap<OtherType>::Type&nbsp;=&nbsp;std::map<double, double>.现在扪心自问:给予TMap<T>::Type是std::map<double, double>,编译器如何知道T是SomeType或OtherType?它甚至不知道多少它有这样的选择,也不知道选择他们自己.。我只是为了思考实验而问你(假设它能知道一套完整的.选择).

慕妹3146593

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

天涯尽头无女友

就连你也有:TMap<SomeType>::Type&nbsp;=&nbsp;std::map<double,&nbsp;double>.但在调用test(TMap)之前TMap<double>::Type&nbsp;tmap;tmap[1.1]&nbsp;=&nbsp;5.2;double&nbsp;d&nbsp;=&nbsp;test(tmap);你已经把它声明为TMap<double>::Type&nbsp;tmap;为什么不能利用这些信息。#ty对联不只是简单的字符串替换。
打开App,查看更多内容
随时随地看视频慕课网APP