Joh*_*nas 51 c++ parameters templates
这段代码有什么问题?
#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;
}
Run Code Online (Sandbox Code Playgroud)
Naw*_*waz 82
那是不可导出的背景.这就是编译器无法推导出模板参数的原因.
想象一下,如果你可能有TMap如下专业:
template <>
struct TMap<SomeType>
{
typedef std::map <double, double> Type;
};
Run Code Online (Sandbox Code Playgroud)
如何将编译器推断类型SomeType,因为TMap<SomeType>::Type是std::map<double, double>?这不可以.它没有保证的类型,你在使用std::map的也是该类型中TMap.编译器无法做出这种危险的假设.类型参数之间可能没有任何关系.
此外,您可能还有另一个TMap定义为:
template <>
struct TMap<OtherType>
{
typedef std::map <double, double> Type;
};
Run Code Online (Sandbox Code Playgroud)
这使情况更糟.现在你有了以下内容:
TMap<SomeType>::Type = std::map<double, double>.TMap<OtherType>::Type= std::map<double, double>.现在问问自己:给定的TMap<T>::Type是std::map<double, double>,编译器如何知道T是SomeType或是OtherType?它甚至不知道它有多少这样的选择,它也不知道自己的选择 ......
我只是为了思考实验而问你(假设它可以知道完整的选择).