这段代码有什么问题?
#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
是std::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>::Type
是std::map<double, double>
,编译器如何知道 T
是否存在?是SomeType
或 OtherType
?它甚至不知道有多少这样的选择,也不知道选择本身...
我问你只是为了进行思想实验(假设它可以知道整套选择)。
我是一名优秀的程序员,十分优秀!