c++ - 为什么模板实参用作另一个模板的模板参数时不能推导出来?

标签 c++ templates parameters

这段代码有什么问题?

#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>::Typestd::map<double, double> ?这不可以。 保证您在 std::map 中使用的 type 也是 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>::Typestd::map<double, double> , 编译器如何知道 TSomeTypeOtherType ?它甚至不知道它有多少个这样的选择,它也不知道选择本身......

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

关于c++ - 为什么模板实参用作另一个模板的模板参数时不能推导出来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6060824/

相关文章:

c++ - 每次都出乎意料的结果

c++ - 我的模板类返回了错误的数据

Javascript发送 "this"对象作为参数

java - 如何随机化参数中的对象?

c++ - 从 C++ 发送电子邮件

c++ - 如何将类中的成员绘制到窗口 C++

c++ - 接收迭代器作为参数并知道类

c++ - Variadic 模板在目标文件中有重复的符号?

c++ - 为什么字符串参数与参数共享相同的地址

c++ - 它被添加到具有相同键的 hash_mapp 字符串