模板匹配的疑惑
#include <utility>
#include <iostream>
using namespace std;
template<int N, typename T>
class DuoT;
//解析 A int, B为prir<char, double>
template<typename A, typename B>
class DuoT<1, pair<A, B>>
{
public:
typedef A ResultT;
};
template<typename A, typename B>
class DuoT<2, pair<A, B>>
{
public:
typedef B ResultT;
};
template<int N, typename A, typename B, typename C>
class DuoT<N, pair<A, pair<B, C>>>
{
public:
typedef typename DuoT<N - 1, pair<B, C>>::ResultT ResultT;
};
template<typename A, typename B, typename C>
class DuoT<1, pair<A, pair<B, C>>>
{
public:
typedef A ResultT;
};
template<typename A, typename B, typename C>
class DuoT<2, pair<A, pair<B, C>>>
{
public:
typedef B ResultT;
};
template<int N, typename T1, typename T2>
void printDuoT(const pair<T1, T2>&)
{
cout << typeid(DuoT<N, pair<T1, T2>>::ResultT).name() << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
pair<int, pair<char, double>> d2;
printDuoT<1>(d2);
return 0;
}
注释掉:
template<typename A, typename B, typename C>
class DuoT<1, pair<A, pair<B, C>>>
{
public:
typedef A ResultT;
};
template<typename A, typename B, typename C>
class DuoT<2, pair<A, pair<B, C>>>
{
public:
typedef B ResultT;
};
会出现错误?请问为什么??
[解决办法]
注释掉以后存在二义性,没有最佳匹配。
DuoT<N, pair<T1, T2>>::ResultT 具体是。
N == 1
T1 == int
T2 == pair<char, double>
此套模板实参可以匹配 class DuoT<1, pair<A, B>>,其中
A == T1 == int,
B == T2 == pair<char,double>
也可以匹配 class DuoT<N, pair<A, pair<B, C>>>,其中
N == 1
A == T1 == int
B == char
C == double