为什么不能从 Template::Type 推导出 T? [复制]

2023-12-29

这段代码有什么问题?

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

这是不可演绎的上下文。这就是编译器无法推导模板参数的原因。

试想一下,如果您可能有专门的TMap如下:

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

编译器如何推导类型SomeType, 鉴于TMap<SomeType>::Type is std::map<double, double>?这不可以。它是not保证了type你使用的std::map is also the type in TMap。编译器不能做出这种危险的假设。之间可能没有任何关系type论据,无论如何。

此外,您可能还有另一个专业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>::Type is std::map<double, double>,编译器如何知道是否T is SomeType or OtherType?它甚至无法知道how many它有这样的选择,它也无法知道choices他们自己...

我只是为了思想实验而问你(假设它可以知道完整的集合)choices).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么不能从 Template::Type 推导出 T? [复制] 的相关文章

随机推荐