gpt4 book ai didi

c++ - 模板实参作为模板参数传给另一个模板时,为什么推导不出来?

转载 作者:太空宇宙 更新时间:2023-11-04 14:19:20 24 4
gpt4 key购买 nike

这段代码有什么问题?

#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 中使用的类型 也是 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> ,编译器如何知道 T 是否存在?是SomeTypeOtherType ?它甚至不知道有多少这样的选择,也不知道选择本身...

我问你只是为了进行思想实验(假设它可以知道整套选择)。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com