考虑以下课程:
template<typename T1, typename T2>
class Pair
{
public:
T1 First;
T2 Second;
Pair(const T1 &First, const T2 &Second) : First(First), Second(Second) { }
}
Run Code Online (Sandbox Code Playgroud)
c ++中不允许以下内容:
auto p = Pair(10, 10);
Run Code Online (Sandbox Code Playgroud)
为什么不允许这样做?类型可以从构造函数调用中完全确定.
我知道有一些解决方法,如:
template<typename T1, typename T2>
Pair<T1, T2> MakePair(const T1 &First, const T2 &Second)
{
return Pair<T1, T2>(First, Second);
}
Run Code Online (Sandbox Code Playgroud)
但为什么需要呢?为什么编译器不能像从函数模板那样从参数中确定类型?你可能会说它因为标准不允许它,所以为什么标准不允许呢?
编辑:
对于那些说这是一个例子的人,为什么不允许这样做:
template<typename T1, typename T2>
class Pair
{
public:
T1 First;
T2 Second;
Pair(const T1 &First, const T2 &Second) : First(First), Second(Second) { }
Pair(const T2 &Second, const T1 &First) : First(First), Second(Second) { }
};
auto p = Pair(10,1.0);
Run Code Online (Sandbox Code Playgroud)
我可以使用函数模板重载完成此操作:
template<typename T1, typename T2>
Pair<T1, T2> MakePair(const T1 &First, const T2 &Second)
{
return Pair<T1, T2>(First, Second);
}
template<typename T1, typename T2>
Pair<T1, T2> MakePair(const T2 &Second, const T1 &First)
{
return Pair<T1, T2>(First, Second);
}
Run Code Online (Sandbox Code Playgroud)
为什么这允许函数而不是类?
Joh*_*ing 10
这就是Bjarne Stroustrup就此事所说的话:
请注意,永远不会推导出类模板参数.原因在于,几个构造者为一个类提供的灵活性会使这种推论在许多情况下变得不可能,并且在更多的情况下变得模糊不清.
考虑以下.
template<typename T1, typename T2>
class Pair
{
public:
T1 First;
T2 Second;
Pair(const T1 &First, const T2 &Second) : First(First), Second(Second) { }
Pair(const T2 &Second, const T1 &First) : First(First), Second(Second) { }
};
auto p = Pair(10,1.0);
Run Code Online (Sandbox Code Playgroud)
p应该是a Pair<int,double>还是Pair<double,int>?