C++03 では、一部のコンテキストでテンプレート パラメーターの推定が行われません。例えば:
template <typename T> struct B {};
template <typename T>
struct A
{
typedef B<T> type;
};
template <typename T>
void f(typename A<T>::type);
int main()
{
B<int> b;
f(b); // ERROR: no match
}
ここでは、 のような入れ子になった型は推定されないコンテキストであるため、int
は推定されません。T
A<T>::type
私はこのように関数を書いていました:
template <typename T> struct B {};
template <typename T>
void f(B<T>);
int main()
{
B<int> b;
f(b);
}
推論されたコンテキストであるB<T>
ため、すべて問題ありません。
ただし、C++11 では、テンプレート エイリアスを使用して、2 番目の例のような構文でネストされた型を偽装できます。例えば:
template <typename T> struct B {};
template <typename T>
struct A
{
typedef B<T> type;
};
template <typename T>
using C = typename A<T>::type;
template <typename T>
void f(C<T>);
int main()
{
B<int> b;
f(b);
}
この場合、テンプレート引数の推論は機能しますか? 言い換えれば、テンプレートエイリアスは推定されたコンテキストですか、それとも推定されていないコンテキストですか? それとも、エイリアスの推定/非推定ステータスを継承しますか?